文章目录
在写项目时,程序运行时难免会有很多异常,为了不让用户看到报错,可能每个接口里都写有try-cache,这样的话既费事又不美观,当Controller接口特别多的时候,代码中就会充斥大量try-catch代码。
使用统一异常拦截,一旦项目中发生了异常,就会进入使用了RestControllerAdvice注解类中使用了ExceptionHandler注解的方法,我们可以在这里处理全局异常,将异常信息输出到指定的位置。并对所有的错误信息进行归置。
统一异常拦截就是将所有的异常都不展示给前端(用户),就像用淘宝,一旦报错,不会展示给用户异常的原因,顶多给用户一个提示语(“系统异常”)。
@ExceptionHandler,作用于方法,声明被注解方法是一个异常处理方法,value属性可以过滤拦截指定异常。
@RestControllerAdvice,作用于类,用于定义一个全局异常处理类,拦截所有restcontroller的异常,返回给前端的数据是json格式
@RestControllerAdvice
@Slf4j
public class ChatServiceExceptionAdvice {
@ResponseBody
@ExceptionHandler(Exception.class)
public Result exceptionHandler(Exception e) {
log.error("执行异常", e);
if (e instanceof MethodArgumentNotValidException) {
MethodArgumentNotValidException exception = (MethodArgumentNotValidException) e;
return Result.getBusinessException(exception.getMessage(), ResponseStatus.BUSINESS_ERROR_STATUS.getCode());
} else if (e instanceof ChatException) {
ChatException exception = (ChatException) e;
return Result.getBusinessException(exception.getMessage(), ResponseStatus.BUSINESS_ERROR_STATUS.getCode());
}else if (e instanceof NullPointerException){
NullPointerException exception=(NullPointerException)e;
return Result.getBusinessException("空指针异常!",ResponseStatus.BUSINESS_ERROR_STATUS.getCode());
}
else {
return Result.getBusinessException("后台异常,请联系管理员!", ResponseStatus.BUSINESS_ERROR_STATUS.getCode());
}
}
}
测试:
controller:
@RestController
@RequestMapping("/app")
public class AppController {
@Autowired
private UserService userService;
@RequestMapping("/test")
public void Test(){
String a=null;
if(a.equals("a")){
System.out.println("hhhhh");
}
}
}
null调用equals会报空指针
可以看到,我的统一异常拦截成功拦截到了这个空指针异常
Controller中的异常,可通过@RestControllerAdvice和@ExceptionHandler来处理,@ExceptionHandler可捕获到Controller中抛出的指定异常。