异常处理
1.基本介绍
- SpringMVC 通过 HandlerExceptionResolver 处理程序的异常,包括 Handler映射、数据绑定以及目标方法执行时发生的异常
- 有两种方案来进行异常处理:
a.在本类编写处理异常的方法,将抛出的异常视为局部异常处理
b.额外编写处理异常的类,将抛出的异常视为全局异常处理
- 主要处理的是 Handler 中使用了 @ExceptionHandler 注解修饰的方法(局部异常处理)
- ExceptionHandlerMethodResolver 内部若找不到上述 @ExceptionHandler 注解修饰的方法,就会去找有 @ControllerAdvice 注解修饰的类中含有 @ExceptionHandler 注解的方法,被 @ControllerAdvice 修饰的类称为全局处理器(全局异常处理)
- 异常处理时,局部异常优先级高于全局异常
2.局部异常
2.1应用实例
(1)创建 MyExceptionHandler.java,在这个 Handler 中模拟各种出现的异常,并在本类添加处理可能出现的异常的方法(局部异常)
局部异常的处理方法只能处理本类中出现的异常。
- package com.li.web.exception;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.ExceptionHandler;
- import org.springframework.web.bind.annotation.RequestMapping;
- import javax.servlet.http.HttpServletRequest;
- /**
- * @author 李
- * @version 1.0
- */
- @Controller
- public class MyExceptionHandler {
- /**
- * 1.localException()方法处理局部异常
- * 2.指定处理 算术异常、空指针异常
- * 3. Exception ex 本类生成的异常对象,会传递给ex,通过ex可以拿到相关信息,
- * 在这里可以加入业务逻辑
- * @param ex
- * @param request
- * @return
- */
- @ExceptionHandler({ArithmeticException.class, NullPointerException.class})
- public String localException(Exception ex, HttpServletRequest request) {
- System.out.println("局部异常信息是=" + ex.getMessage());
- //如何将异常的信息带到下一个页面(根据你的业务逻辑)
- request.setAttribute("reason", ex.getMessage());
- return "exception_mes";
- }
- /**
- * 1.编写方法,模拟异常-算术异常
- * 2.如果我们不做异常处理,是由tomcat默认页面处理
- * @param num
- * @return
- */
- @RequestMapping(value = "/testException01")
- public String test01(Integer num) {
- int i = 9 / num;
- return "success";
- }
- }
复制代码 (2)exception_mes.jsp- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>异常信息</title>
- </head>
- <body>
- <h1>异常信息提示</h1>
- <h4>${requestScope.reason}</h4>
- </body>
- </html>
复制代码 (3)测试,直接访问 http://localhost:8080/springmvc/testException01?num=0,显示结果如下:
捕获到了异常,SpringMVC 底层反射调用了 localException 方法进行异常处理,跳转到了 exception_mes.jsp 页面提示异常信息。
如果我们没有处理异常,默认是由 tomcat 进行异常处理
2.2执行流程
从发生异常到捕获异常并调用处理方法,局部异常处理的整个执行流程是怎样的呢?
第一步:浏览器访问目标方法,如果出现异常,会到 ExceptionHandlerMethodResolver 类中执行 resolveMethodByExceptionType() 方法
第二步:执行resolveMethodByExceptionType() 方法,得到处理异常的方法。
[code]@Nullablepublic Method resolveMethodByExceptionType(Class |