统一异常拦截@RestControllerAdvice和@ExceptionHandler

文章目录

在写项目时,程序运行时难免会有很多异常,为了不让用户看到报错,可能每个接口里都写有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会报空指针
统一异常拦截@RestControllerAdvice和@ExceptionHandler_第1张图片
可以看到,我的统一异常拦截成功拦截到了这个空指针异常

Controller中的异常,可通过@RestControllerAdvice和@ExceptionHandler来处理,@ExceptionHandler可捕获到Controller中抛出的指定异常。

你可能感兴趣的:(java,spring,boot,学习)