大家是不是都有一个烦恼,后端代码一个报错了,前端直接跟着炸掉,忽然跳出个500异常给用户,直接一脸懵逼,知道哪里会报错用try给它包起来也还好,可问题是 异常就是不经意产生的 咱们也不知道哪会报错,而且写一大堆的try 代码的可读性也随之减少,所以springboot这个异常捕获真的是太nice了,我捕获到异常直接在后端给它处理掉,多爽哈哈哈,或者是返回一个false的结果给前端,如果响应的结果是false则弹出一个友好的小框框是不是相比于突然的500更贴心呢。
怎么用呢,首先这有一个局部异常处理,一个是全局异常处理。
局部异常
咱们先来写局部异常,它有一个注解@ExceptionHandler 该注解的参数就是Exception.class,当然这肯定不只限于Exception 随便换成什么异常都行。over~说的还是有点抽象,直接上代码:
/**
* 局部异常捕获
* MaxUploadSizeExceededException 异常处理
* @param e
* @return
*/
@ExceptionHandler(MaxUploadSizeExceededException.class)
public ResponseEntity maxUploadSizeExceededException(MaxUploadSizeExceededException e){
e.printStackTrace();
return new ResponseEntity(false,"您上传的文件太大了","500");
}
这是我文件上传的一个controller ,因为application.yml限制了文件大小,就怕用户传的文件太大然后报错,所以对于这个异常给它返回一个通用的结果,ResponseEntity是我直接封装的统一返回结果,new ResponseEntity(true/false,message,code),里面还有多个方法重载,还可以带参数返回窝~,等下这不是重点(捂脸30秒)。
全局异常
全局异常的话,和局部异常简直一毛一样,只需要在controller上面加上一个注解就好了@RestControllerAdvice
/**
* 全局异常处理器
* @author shenwang
* @version 1.0
* @date 2021/8/23 10:18
*/
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 日志
*/
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
* 处理 Exception 异常
* @param httpServletRequest
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
public ResponseEntity exceptionHandler(HttpServletRequest httpServletRequest,Exception e){
e.printStackTrace();
logger.error("服务错误:"+e.toString());
return new ResponseEntity(false,"服务出现异常",500);
}
}
哦,对了,还有一个问题,就是我局部异常和全局异常写了同一个异常的处理方法怎么办?对于这个问题,肯定是执行局部异常处理方法呀,有优先级的 局部异常的优先级高于全局的优先级
版权声明:本文为gloamer原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。