全局异常处理
大约 3 分钟
*异常处理两种方式
开发过程中是不可避免地会出现各种异常情况的,例如网络连接异常、数据格式异常、空指针异常等等。异常的出现可能导致程序的运行出现问题,甚至直接导致程序崩溃。因此,在开发过程中,合理处理异常、避免异常产生、以及对异常进行有效的调试是非常重要的。
对于异常的处理,一般分为两种方式:
- 编程式异常处理:是指在代码中显式地编写处理异常的逻辑。它通常涉及到对异常类型的检测及其处理,例如使用 try-catch 块来捕获异常,然后在 catch 块中编写特定的处理代码,或者在 finally 块中执行一些清理操作。在编程式异常处理中,开发人员需要显式地进行异常处理,异常处理代码混杂在业务代码中,导致代码可读性较差。
- 声明式异常处理(tx):则是将异常处理的逻辑从具体的业务逻辑中分离出来,通过配置等方式进行统一的管理和处理。在声明式异常处理中,开发人员只需要为方法或类标注相应的注解(如
@Throws或@ExceptionHandler),就可以处理特定类型的异常。相较于编程式异常处理,声明式异常处理可以使代码更加简洁、易于维护和扩展。
SpringMVC 声明式全局异常处理
SpringMVC 基于 AOP 实现全局异常处理。通过定义通知、指定处理的异常类型,SpringMVC 即可实现异常处理切面的织入,实现全局异常处理。
声明异常处理控制类
/** * @RestControllerAdvice = @ControllerAdvice + @ResponseBody * @ControllerAdvice 代表当前类的异常处理controller! */ @RestControllerAdvice public class GlobalExceptionHandler { }在异常处理控制类内统一定义异常处理handler方法(即通知)
异常处理handler 可以实现对出现异常的请求的处理,它的返回代表了对这个出现异常的请求的响应,如返回逻辑视图、返回响应体、转发、重定向等。
异常处理handler 允许的方法参数和意义与普通的handler无异,但其还可以在方法参数中声明对应异常的形参,当请求发生异常后,SpringMVC会将异常对象注入给异常形参。
/** * 异常处理handler * @ExceptionHandler(HttpMessageNotReadableException.class) * 该注解标记异常处理Handler,并且指定发生异常调用该方法! * @param e 获取异常对象! * @return 返回handler处理结果! */ @ExceptionHandler(HttpMessageNotReadableException.class) public Object handlerJsonDateException(HttpMessageNotReadableException e){ return null; } /** * 当发生空指针异常会触发此方法! * @param e * @return */ @ExceptionHandler(NullPointerException.class) public Object handlerNullException(NullPointerException e){ return null; } /** * 所有异常都会发此方法! * 如果有具体的异常处理Handler,具体异常处理Handler优先级更高! * 例如: 发生NullPointerException异常! * 会触发handlerNullException方法,不会触发handlerException方法! * @param e * @return */ @ExceptionHandler(Exception.class) public Object handlerException(Exception e){ return null; }配置包扫描,确保异常处理控制类能被扫描到
