使用@ControllerAdvice实现统一异常处理
工作空闲之余,学习一下项目中的各种写法,今天学习实现的是项目中的统一异常处理。controller层负责的是与用户界面交互的职责,但是当controller层抛出异常,并且未能够进行try catch处理时,会将异常之间显示到前端界面,这边写个简单的除0错误模拟一下;
Controller层代码:
/** * @ClassName NotProcessExceptionController * @Description TODO * @Author charlotte * @Date 2022/8/24 */ @RestController public class NotProcessExceptionController { @GetMapping("/test") public Integer getRes(){ int res = 1/0; //触发除0错误 return res; } }
点击localhost:8080/test 访问该controller,显示的结果如下:
可以看到,页面直接将异常信息返回到了前端页面上,当系统出现错误时,影响用户的体验,所以需要将异常进行统一的处理,这时候就要用到@ControllerAdvice 注解,结合 @ExceptionHandler 处理对应类型的异常:
@Slf4j @ControllerAdvice public class ExceptionHandlerAdvice { @ResponseBody @ExceptionHandler(ArithmeticException.class) public String processArithmeticException(Exception e){ System.out.println("统一处理 异常!"); e.printStackTrace(); return "运算条件异常,请检查后重试!"; } @ResponseBody @ExceptionHandler(NullPointerException.class) public String processNullPointException(Exception e){ System.out.println("统一处理 异常!"); e.printStackTrace(); return "出现空指针异常,请检查后重试!"; } }
1、结合@ExceptionHandler注解,实现异常的统一处理
2、结合@InitBinder注解,实现自定义请求参数格式/请求参数预处理
3、结合@ModelAttribute注解,实现数据绑定
具体可以参考以下几篇文章:
https://www.cnblogs.com/lenve/p/10748453.html
https://blog.csdn.net/qq_36829919/article/details/101210250
上面的代码自定义了两类异常的处理,分别是计算符异常以及空指针异常,在controller层分别模拟抛出上述异常,查看前端显示的结果。
@RestController public class NotProcessExceptionController { @GetMapping("/test1") public Integer getRes1(){ int res = 1/0; //触发除0错误 return res; } @GetMapping("/test2") public Integer getRes2(){ throw new NullPointerException(); //抛出空指针异常 } }
访问: http://localhost:8080/test1,前端显示如下:
访问:http://localhost:8080/test2,前端显示如下: