异常捕获与处理
在处理异常之前,必须先捕获我们想要处理的异常类型,这里需要用到注解@ExceptionHandler
。
@ExceptionHandler
注解打在处理异常的方法上,同时需要在注解的参数中指定要捕获的异常类型。例如需要捕获和处理 HttpException
:
@ExceptionHandler(value=HttpException.class)
public void handlHttpException(HttpException e){
...
}
全局异常处理
了解了上面的方法后,我们就可以实现异常的捕获和处理了。但有个问题,如何全局监听异常、捕获和处理异常呢?
这里就需要用到@ControllerAdvice
注解了。
关于ControllerAdvice
:学名是Controller增强器,作用是给Controller控制器添加统一的操作或处理。看到Controller增强器,我们明白,ControllerAdvice
跟很多 component 注解一样,是打在类上面的。
所以,使用ControllerAdvice
结合我们上面的@ExceptionHandler
来处理全局异常再合适不过了。
自定义一个全局异常处理类,处理 HttpException
:
@ControllerAdvice
public class GlobalExceptionAdvice {
@ExceptionHandler(value = HttpException.class)
@ResponseBody
public Object handleHttpException(HttpServletRequest req, HttpException e) {
...
}
}
Q: 至于这里捕获异常为什么是传入两个参数?
A: 在 Spring MVC 中,异常处理方法能接收到 HttpServletRequest req
和 HttpException e
两个参数是因为 Spring 框架在处理异常时,会自动将当前的 HttpServletRequest 对象和捕获到的异常对象传递给异常处理方法。这是通过 Spring 的反射机制和方法参数解析机制实现的。
其实你改成一个参数参数HttpException e
也是能够被捕获进入到方法的,这就是 SpringMVC 的厉害之处!