文章目录
1. 需求
- 在使用springboot的时候,如果出现异常,通常都是throw抛出,如下例子:
- 而有时我们又统一处理异常,使之返回更加好的信息,因此我们需要对异常信息作个统一处理。
2. 异常信息统一处理
1. 在controller层中使用@ExceptionHandler
-
代码(入门):
@RestController public class TestController { @GetMapping("/test") public void test() { // 模拟异常 int i = 1/0; } // 被该注解的方法 作为异常处理的方法 // 注解参数:针对什么异常,若异常为Exception类型,则会执行该方法 @ExceptionHandler(Exception.class) public String testException(){ return "我是test的Controller里面的异常处理方法"; } }
2. 关于@ExceptionHandler的那点事
-
在同一个controller层中,可以定义多个被@ExceptionHandler注解的方法,但是异常类型不能出现一样的,否则运行时抛异常
-
异常类型越细化,就用谁,如下:有两个异常类型,明显testException2方法上的异常类型更加细化,明显:
@RestController public class TestController { @GetMapping("/test") public void test() { int i = 1/0; } @ExceptionHandler(Exception.class) public String testException(){ return "我是test的Controller里面的异常处理方法testException"; } @ExceptionHandler(ArithmeticException.class) public String testException2(){ return "我是test的Controller里面的异常处理方法testException2"; } }
-
在一个controller层中定义的@ExceptionHandler的方法,只负责自己controller层的异常,不多管闲事。
3. 配置全局统一异常处理(@ExceptionHandler与@RestControllerAdvice)
- @ControllerAdivce 与 @RestControllerAdivce 区别在于 后者多了个@ResponseBody
- 两者都是controller的切面,若对spring的AOP不太了解可以看看这篇文章:
https://blog.csdn.net/xueyijin/article/details/121893953?spm=1001.2014.3001.5501 - 代码:
@RestControllerAdvice public class MyException { @ExceptionHandler(Exception.class) public String handleException(Exception e) { return "我是MyException的方法"; } }
@RestController public class Test2Controller { @GetMapping("/test2") public void test2(){ int i = 1/0; } }
4. 全局异常信息处理与在controller层异常处理的那点事
-
即设置了全局异常处理方法,又设置了controller层异常处理的方法,优先选择自己的controller层
@RestController public class TestController { @GetMapping("/test") public void test() { int i = 1/0; } @ExceptionHandler(Exception.class) public String testException(){ return "我是test的Controller里面的异常处理方法testException"; } } @RestControllerAdvice public class MyException { @ExceptionHandler(Exception.class) public String handleException(Exception e) { return "我是MyException的方法"; } }
-
两者都是一样,若定义了多个异常类型处理方法,优先选择详细那个处理。
3. 总结
- 可以在controller层使用,@ExceptionHandler定义异常处理方法。
- 可以定义全局异常处理方法,@ExceptionHandler与@RestControllerAdvice
- 优先选择controller层的异常处理方法
- 优先选择详细的异常类型的方法处理。