springboot统一异常处理

218 阅读2分钟

一、全局异常处理

1、自定义异常处理类

 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseBody;
 ​
 /**
  * @author: cvv
  * @since: 1.0
  * @version: 1.0
  * @description:全局异常处理类
  */
 ​
 @ControllerAdvice
 @Slf4j
 public class MyExceptionHandler {
 ​
     //全局异常处理
     @ExceptionHandler(Exception.class)
     @ResponseBody
     public String exceptionHandler(Exception e){
         log.error("全局异常已捕获:异常原因:()" + e);
         return "全局异常已捕获:异常原因:" + e;
     }
 }

测试:

1、在controller中抛出一个异常

 @RestController
 @RequestMapping("user")
 public class UserController {
 ​
     @GetMapping("exception-test")
     public void exceptionTest(){
         String str = null;
         str.equals("666");
     }
 }

2、在浏览器中访问此方法

image-20230715190834300.png

捕获成功。

二、特定异常处理

1、在异常处理类中添加特定异常处理方法

 @ControllerAdvice
 @Slf4j
 public class MyExceptionHandler {
     //全局异常处理
     @ExceptionHandler(Exception.class)
     @ResponseBody
     public String exceptionHandler(Exception e){
         log.error("全局异常已捕获:异常原因:()" + e);
         return "全局异常已捕获:异常原因:" + e;
     }
 ​
 ​
    //指定/特定异常处理
     @ExceptionHandler(ArithmeticException.class)
     @ResponseBody
     public String exceptionHandler(ArithmeticException e){
         log.error("ArithmeticException以被捕获,正在处理该异常");
         return "ArithmeticException以被捕获,正在处理该异常";
     }
     
     
 }

如上文所见,我们要处理一个特定的异常时,只需要缩小异常的范围即可。

springboot异常处理机制,会先走特定异常处理的方法,如果没有找到该异常的处理方法,则最后走全局异常处理方法

测试

1、在controller中抛出一个异常

 @RestController
 @RequestMapping("user")
 public class UserController {
 ​
     @GetMapping("special-exception-test")
     public void specialExceptionTest(){
         throw new ArithmeticException("我报异常啦");
     }
     
 }

2、在浏览器中访问此方法

image-20230715192606825.png

二、自定义异常处理

1、先自定义一个简单异常

 public class loginException extends RuntimeException{
     public loginException(String message) {
         super(message);
     }
 }

2、将异常处理添加到异常处理类中

 @ControllerAdvice
 @Slf4j
 public class MyExceptionHandler {
     //全局异常处理
     @ExceptionHandler(Exception.class)
     @ResponseBody
     public String exceptionHandler(Exception e){
         log.error("全局异常已捕获:异常原因:()" + e);
         return "全局异常已捕获:异常原因:" + e;
     }
 ​
 ​
    //指定/特定异常处理
     @ExceptionHandler(ArithmeticException.class)
     @ResponseBody
     public String exceptionHandler(ArithmeticException e){
         log.error("ArithmeticException以被捕获,正在处理该异常");
         return "ArithmeticException以被捕获,正在处理该异常";
     }
 ​
 ​
     //自定义异常处理
     @ExceptionHandler(loginException.class)
     @ResponseBody
     public String exceptionHandler(loginException e){
         log.error(e.getMessage());
         return e.getMessage();
     }
     
     
 }

自定义异常处理流程跟以上两种异常处理流程一样

1、在controller中抛出一个异常

 @RestController
 @RequestMapping("user")
 public class UserController {
 ​
     @GetMapping("login-exception-test")
     public void loginExceptionTest(){
         throw new loginException("登录异常");
     }
     
 }

2、在浏览器中访问此方法

image-20230715193455314.png