使用@ControllerAdvice实现统一异常处理

工作空闲之余,学习一下项目中的各种写法,今天学习实现的是项目中的统一异常处理。controller层负责的是与用户界面交互的职责,但是当controller层抛出异常,并且未能够进行try catch处理时,会将异常之间显示到前端界面,这边写个简单的除0错误模拟一下;

Controller层代码:

/**
 * @ClassName NotProcessExceptionController
 * @Description TODO
 * @Author charlotte
 * @Date 2022/8/24
 */
@RestController
public class NotProcessExceptionController {
    @GetMapping("/test")
    public Integer getRes(){
        int res = 1/0;  //触发除0错误
        return res;
    }
}

点击localhost:8080/test 访问该controller,显示的结果如下:

 

 

 可以看到,页面直接将异常信息返回到了前端页面上,当系统出现错误时,影响用户的体验,所以需要将异常进行统一的处理,这时候就要用到@ControllerAdvice 注解,结合 @ExceptionHandler 处理对应类型的异常:

@Slf4j
@ControllerAdvice
public class ExceptionHandlerAdvice {

    @ResponseBody
    @ExceptionHandler(ArithmeticException.class)
    public String processArithmeticException(Exception e){
        System.out.println("统一处理 异常!");
        e.printStackTrace();
        return "运算条件异常,请检查后重试!";
    }
    @ResponseBody
    @ExceptionHandler(NullPointerException.class)
    public String processNullPointException(Exception e){
        System.out.println("统一处理 异常!");
        e.printStackTrace();
        return "出现空指针异常,请检查后重试!";
    }
}

1、结合@ExceptionHandler注解,实现异常的统一处理

2、结合@InitBinder注解,实现自定义请求参数格式/请求参数预处理

3、结合@ModelAttribute注解,实现数据绑定

具体可以参考以下几篇文章:

https://www.cnblogs.com/lenve/p/10748453.html

https://blog.csdn.net/qq_36829919/article/details/101210250

上面的代码自定义了两类异常的处理,分别是计算符异常以及空指针异常,在controller层分别模拟抛出上述异常,查看前端显示的结果。

@RestController
public class NotProcessExceptionController {
    @GetMapping("/test1")
    public Integer getRes1(){
        int res = 1/0;  //触发除0错误
        return res;
    }
    @GetMapping("/test2")
    public Integer getRes2(){
        throw new NullPointerException();  //抛出空指针异常
    }
}

访问: http://localhost:8080/test1,前端显示如下:

 

 访问:http://localhost:8080/test2,前端显示如下:

 

posted @ 2022-08-24 15:16  charler。  阅读(556)  评论(0编辑  收藏  举报