- Spring MVC 通过
HandlerExceptionResolver
处理程序的异常,包括Handler
映射、数据绑定以及目标方法执行时发生的异常 - SpringMVC 提供的
HandlerExceptionResolver
的实现类
- 当没有装配
<mvc:annotation-driven/>
时,默认使用以下三个HandlerExceptionResolver
- 当装配了
<mvc:annotation-driven/>
时,默认使用以下三个HandlerExceptionResolver
ExceptionHandlerExceptionResolver
- 用来处理被
@ExceptionHandler
标注了处理方法的异常 - 处理异常的方法用
@ExceptionHandler
标注,可以放置在标注了Controller
的类下面;也可以放置在单独写的一个类,标注为@ControllerAdvice
,表示全局的异常处理类。 - 以下方法表示,可以处理
ArithmeticException
的方法。可以在入参中接收Exception
。返回值也可以如普通的请求映射一样,返回String
类型,表示转发到指定的页面;也可以返回ModelAndView
,在其中携带一些需要的对象。(注意,不能让Map
作为入参)@ExceptionHandler(ArithmeticException.class) public ModelAndView arithmeticExceptionHandler(Exception e) { System.out.println("发生了 " + e); ModelAndView mv = new ModelAndView("error"); mv.addObject("exception", e); return mv; }
- 请求映射。当
num
为0时,会触发ArithmeticException
异常。@RequestMapping("/div") public String div(Integer num) { int res = 10 / num; return "success"; }
- 异常之后,会跳转到该页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>ERROR</title> </head> <body> <h1>发生异常了</h1> <div>${exception}</div> </body> </html>
- 当一个控制器类中存在多个异常处理方法时,以更精确的异常的方法为处理方法。
- 全局处理方法
@ControllerAdvice public class MyExceptionHandler { @ExceptionHandler(Exception.class) public ModelAndView allExceptionHandler(Exception e) { ModelAndView mv = new ModelAndView("error"); mv.addObject("exception", e); System.out.println(mv); return mv; } }
- 当即存在控制器内的处理方法,又存在全局处理方法时,优先选择控制器内自身的处理方法,无论异常是否精确。
ResponseStatusExceptionResolver
- 用来处理自定义的异常,需要在该自定义异常上注解
@ResponseStatus
- 自定义异常,
reason
为异常原因,会在异常页面上显示,value
为异常的状态编码。@ResponseStatus(reason="登录名不存在", value= HttpStatus.FORBIDDEN) public class UsernameNotFoundException extends RuntimeException { static final long serialVersionUID = -70348971944146939L; }
- 请求映射。与一般异常一样,直接抛出即可。
@RequestMapping("usernfTest") public String usernfTest(String username) { if (!"admin".equals(username)) throw new UsernameNotFoundException(); return "success"; }
DefaultHandlerExceptionResolver
- 用来处理一些特殊的异常(Spring MVC自己定义的)
NoSuchRequestHandlingMethodException
HttpRequestMethodNotSupportedException
HttpMediaTypeNotSupportedException
HttpMediaTypeNotAcceptableException
- 尝试触发一个异常
- 请求映射
@RequestMapping(value = "/postRequest", method = RequestMethod.POST) public String postRequest() { System.out.println("post 请求"); return "success"; }
- 当在浏览器中发出请求的时候,是
get
请求,因此会触发异常HttpRequestMethodNotSupportedException
SimpleMappingExceptionResolver
- 该异常处理器不是默认的,需要在配置文件中配置。
- 可以实现在xml文件中确定异常及异常显示页面的映射关系。
- 注册
SimpleMappingExceptionResolver
。exceptionAttribute
用来设置用来保存异常对象的key名,默认也是exception
。exceptionMappings
用来保存异常以及页面之间的映射关系。error
指向error.jsp
文件。<bean id="simpleMappingExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 设置保存异常信息的属性名,底层会自动将该名字作为key,value为异常对象 --> <property name="exceptionAttribute" value="exception"/> <property name="exceptionMappings"> <props> <prop key="java.lang.NullPointerException">error</prop> </props> </property> </bean>