一、全局异常处理
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、在浏览器中访问此方法
捕获成功。
二、特定异常处理
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、在浏览器中访问此方法
二、自定义异常处理
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("登录异常");
}
}