1、概念
它的概念是建立异常类型与方法之间的映射关系。即出错之后,运行指定的方法。
当抛出异常之后,会查找有@ExceptionHandler注解的方法,默认情况下只会在当前Controller类中查找。若要设置全局的, 可以配置Controller的切面。具体做法把异常处理的方法提取到公共类中,在类上添加@ControllerAdvice注解,在方法上添加@ExceptionHandler注解。。
@ExceptionHandler只有一个属性value,值为异常类型对应的Class类集合。
当value属性为空时,相当于默认值,会处理所有的异常。
若value值重复时,即一个exception 类型有多个方法与之对应时,抛出IllegalStateException。
当异常抛出,被HandlerExceptionResolver处理之后,抛出的异常被捕获,请求会被视为正常结束,返回的状态码为200。若想返回特定的响应码,可以配合@ResponseStatus注解。
2、使用
第一步,注入ExceptionHandlerExceptionResolver,查看dispatcher.properties,它是默认存在的,无需额外的配置。
第二步,编写方法handlerException,标注@ExceptionHandler,value属性指定异常类型。
注:@ControllerAdvice相当于AOP中的advice。
3、示例
若配置适用于单个Controller,示例如下
// 请求的方法 @GetMapping("/test/exception") public String divideNumber() { System.out.println(1 / 0); return ""; } // 处理异常的方法 @ExceptionHandler(value = ArithmeticException.class) public ModelAndView resolve() { return new ModelAndView("error/arithmeticException"); }
若配置适用于全局的异常处理,示例如下:
// 相当于AOP中的advice @ControllerAdvice public class ExceptionController { /** * * @Title: resolve * @Description:解决异常的方法 * @return */ @ExceptionHandler(value = ArithmeticException.class) public ModelAndView resolve() { return new ModelAndView("error/arithmeticException"); } }
4、ResponseStatusExceptionResolver
它的概念是建立异常类型与响应码之间的映射关系,若没有上述的ExceptionResolver,Web容器会根据响应码生成特定的页面,例如最常见的404,501。若使用上述的ExceptionResolver,它只会改变响应码的值。
ResponeStatusExceptionResolver会根据@ResponseStatus注解的code属性值返回响应码
当@ResponseStatus标注在异常类上时,它只适用于自定义异常。Java内置,第三方的异常类型无法修改,例如NullPointerException
当@ResponseStatus标注在ExceptionHandler的handler方法上时,它适用于该方法匹配的所有异常。
当@ResponseStatus标注在@RequestMapping的方法上时,设置方法的响应码,无论方法是否正常结束。
使用时需要注入ResponeStatusExceptionResolver,它是默认注入的。