Spring MVC异常处理

  在 Spring MVC 应用的开发中,不管是操作底层数据库,还是业务层或控制层,都会不可避免地遇到各种可预知的、不可预知的异常。我们需要捕捉处理异常,才能保证程序不被终止。

  Spring MVC 有以下 3 种处理异常的方式:

  1、使用 Spring MVC 提供的简单异常处理器 SimpleMappingExceptionResolver。

  2、实现 Spring 的异常处理接口 HandlerExceptionResolver,自定义自己的异常处理器。

  3、使用 @ExceptionHandler 注解实现异常处理

  1. @ExceptionHandler

  局部异常处理仅能处理指定 Controller 中的异常。

  示例 1:下面使用 @ExceptionHandler 注解实现。定义一个处理过程中可能会存在异常情况的 testExceptionHandle 方法。

@RequestMapping("/testExceptionHandle")
public String testExceptionHandle(@RequestParam("i") Integer i) {
    System.out.println(10 / i);
    return "success";
}12345复制代码类型:[java]

  显然,当 i=0 时会产生算术运算异常。

  下面在同一个类中定义处理异常的方法。

@ExceptionHandler({ ArithmeticException.class })
public String testArithmeticException(Exception e) {
    System.out.println("打印错误信息 ===> ArithmeticException:" + e);
    // 跳转到指定页面
    return "error";
}123456复制代码类型:[java]

  注意:该注解不是加在产生异常的方法上,而是加在处理异常的方法上。

  异常页面 error.jsp 代码如下。

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>




错误页面


    发生算术运算异常,请重新输出数据!

123456789101112复制代码类型:[java]

  访问地址:http://localhost:8080/springmvcDemo2/testExceptionHandle?i=0.页面跳转到 error.jsp 页面,运行结果如图 1 所示。

Spring MVC异常处理

  控制器输出结果如下。

打印错误信息 ===> ArithmeticException:java.lang.ArithmeticException: / by zero1复制代码类型:[java]

  @ExceptionHandler 注解定义的方法优先级问题:例如发生的是 NullPointerException,但是声明的异常有 RuntimeException 和 Exception,这时候会根据异常的最近继承关系找到继承深度最浅的那个@ExceptionHandler 注解方法,即标记了 RuntimeException 的方法。

  被 @ExceptionHandler 标记为异常处理方法,不能在方法中设置别的形参。但是可以使用 ModelAndView 向前台传递数据。

  使用局部异常处理,仅能处理某个 Controller 中的异常,若需要对所有异常进行统一处理,可使用以下两种方法。

  2. HandlerExceptionResolver

  Spring MVC 通过 HandlerExceptionResolver 处理程序异常,包括处理器异常、数据绑定异常以及控制器执行时发生的异常。HandlerExceptionResolver 仅有一个接口方法,源码如下。

public interface HandlerExceptionResolver {
    @Nullable
    ModelAndView resolveException(
            HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex);
}12345复制代码类型:[java]

  发生异常时,Spring MVC 会调用 resolveException() 方法,并转到 ModelAndView 对应的视图中,返回一个异常报告页面反馈给用户。

  3. SimpleMappingExceptionResolver

  全局异常处理可使用 SimpleMappingExceptionResolver 来实现。它将异常类名映射为视图名,即发生异常时使用对应的视图报告异常。

  示例 3:在 springmvc-servlet.xml 中配置全局异常,代码如下。


    
    
    
    
    
    
        
            error
            
        
    
12345678910111213复制代码类型:[python]

  再次访问 http://localhost:8080/springmvcDemo2/testExceptionHandle?i=0.页面跳转到 error.jsp 页面,运行结果如上图 1 所示。

开课吧广场-人才学习交流平台

展开阅读全文

页面更新:2024-05-11

标签:异常   算术   注解   视图   示例   全局   控制器   处理器   定义   类型   发生   页面   代码   方法   数据   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top