1. SpringBoot 全局捕获异常
首先写一个会抛出异常的 Controller 类 如下所示,i = 1/0, 0不能作为除数,显然这个 Controller 类 ErrorController.java 会抛出异常。
@EnableAutoConfiguration
@RestController
public class ErrorController {
@RequestMapping("/errorTest")
public String errorTest() {
int i = 1/0; // 错误代码
return "你好";
}
}
访问 :http://localhost:8080/errorTest,如下图所示,500 错误(服务器端错误),错误信息 / by zero 。
把错误信息直接暴露出来显然不合适,如何处理Controller 类异常,可以使用 try catch 语句捕获异常,但是每个 Controller 都写 try catch 语句 比较臃肿,SpringBoot 中可以使用 @ControllerAdvice 注解全局捕获异常,@ControllerAdvice 注解的原理是 Spring 的 AOP 功能, 在往下的话使用的是 Java 的动态代理技术。
解释完 @ControllerAdvice 注解,下面来试用一下这个注解。全局控制样异常类ControllerExceptionHandler.java如下所示:
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class ControllerExceptionHandler {
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public String exceptionHandler() {
return "服务器开小差了,马上回来";
}
}
ErrorController.java不进行修改,再次访问 :http://localhost:8080/errorTest,如下图所示: