目录
前言
方案
示例
测试
总结
前言
朋友们大家好啊,随着项目的进行,接口也是越来越多了,每个接口无论调用成功与否,都要有相应的应对措施,总不能出错的时候返回一堆异常信息给调用者,所以每个接口都应有完善的处理机制,但是随着接口的逐渐增多,异常的种类也在逐渐增多,这时候再去管理异常的时候,就比较繁琐了,所以迫切的需要一个全局处理器,统一管理一些常见的异常
方案
因为用的是springBoot框架,正好借用提供的注解@ControllerAdvice和@ExceptionHandler实现自定义异常处理
@ControllerAdvice注解
可以用于定义全局异常处理器,支持在一个类中几种处理所有的Controller层抛出的异常
@ExceptionHandler注解
可以用于标记一个方法,标识该方法用于处理特定异常
示例
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleGlobalException(Exception e){
logger.error("Global Exception Handler:"+e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Please try later.");
}
}
测试
手动在接口上抛出一个普通异常,然后调用接口查询,可以看到断点处停了,并且携带了我们抛出的异常信息,并且接口的返回结果也是处理器中定义好的
总结
这种处理机制是配合了Spring框架的AOP原理,@ControllerAdvice注解的底层原理大致是这样的,使用该注解标记的类在Spring启动的时候被扫描并注册为异常处理器,可以捕获程序中抛出的异常,Spring通过AOP代理机制,也就是说在方法执行前和执行后去执行相应的逻辑
@ExceptionHandler注解也是,抛出异常后,Spring会寻找相匹配的@ExceptionHandler方法(也就是我们在异常类中标注的方法),并且调用该方法来处理异常。
文章到这里就结束了