描述
在项目开发中,不管是对底层数据库操作过程,还是以业务层的处理过程,以及控制层的处理,都会不可避免的遇到各种预知或不可预知的异常需要进行处理;如果每个异常删除处理,则会造成工作量增大,而且项目维护也不好维护。
所以SpringMVC就提供了统一处理异常的机制。
SpringMVC处理异常的方式
- 使用Spring MVC提供的简单异常处理器
SimpleMappingExceptionResolver
; - 自定义异常类,实现Spring的异常接口
HandlerExceptionResolver
,自己自定义异常处理器。 - 使用
@ExceptionHandler
异常处理器注解,实现异常处理。
实现HandlerExceptionResolver接口,自定义异常类
-
自定义的异常类
/** * 自定义异常处理类,需要将此类配置到Spring容器 */ @Component public class MyExceptionDome implements HandlerExceptionResolver { /** * * @param httpServletRequest 请求对象 * @param httpServletResponse 响应对象 * @param o 产生异常的方法对象,底层类型就是Method类型,只不过Spring进行了封装 * @param e 具体的异常对象 * @return */ @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { System.out.println("异常处理方法执行..."); //判断异常类型,然后做相应处理 if (e instanceof ArithmeticException) { System.out.println("算数运算异常..."); } //跳转相应错误显示页面 return null; } }
只要程序产生异常,都会进入此异常类,Spring通过此类实现的
HandlerExceptionResolver
接口,就能够知道这是一个异常处理类。 -
异常方法测试
/** * 异常方法 */ @RequestMapping("/demo15") @ResponseBody public User demo15() { User user = new User("zhangsan", 18); System.out.println("请求方法执行..."); //模拟异常 int i = 1 / 0; return user; }
-
结果
-
注意点
- 要将自定义的注解类配置到Spring容器中,进行管理,当程序出现异常的时候,Spring才会调用执行你配置的异常处理类。
- 自定义异常类的方式与使用注解方法不能同时使用,会引起冲突。
使用注解方式,实现异常的分类管理
所使用注解
- @ControllerAdvice
- 类型:类注解,作用于类的上方
- 作用:设置当前类为异常处理类
- @ExceptionHandler
- 类型:方法注解,作用于异常处理类中的方法上,针对指定异常做处理。
- 作用:设置指定异常的处理方法。
注解配置异常处理类
-
异常处理类
/** * 异常处理类 */ @ControllerAdvice @Component public class ExceptionAdvice { /** * 自定义处理指定异常的方法 * @param e 报错的异常对象 * @return 异常信息 */ @ExceptionHandler(Exception.class) //处理所有异常 // @ExceptionHandler(NullPointerException.class) 指定处理空指针异常 //Exception :异常对象 @ResponseBody public String ExceptionFunction(Exception e) { //获取异常消息,并响应给前端 String message = e.getMessage(); return message; } }
-
模拟异常方法
@Controller public class ExceptionController { @RequestMapping("/exception") @ResponseBody public void findAll() { //手动添加一个运行时异常 throw new RuntimeException("running Exception..."); } }
-
响应结果
两种异常处理方式对比
-
注解处理器可以拦截到入参类型转换异常。
-
非注解处理器无法拦截到入参类型转换异常。
-
入参类型转换异常指的是把请求中的参数,映射到处理方法的形参上,出现的异常。
-
入参异常?
就是将请求中的参数,封装到处理方法的形参时,出现类型转换等异常。