zoukankan      html  css  js  c++  java
  • springboot + @ControllerAdvice + @ExceptionHandler 实现全局异常拦截

    1.目的:实现全局异常拦截,不用在controller在写try catch,使用代码看起来更加整洁

    2.不啰嗦直接上代码

    2.1首先我们创建一个异常捕获处理类(@RestControllerAdvice = @ControllerAdvice + @ResponseBody)

    @RestControllerAdvice
    @Slf4j
    public class GlobalExceptionHandler {

    /**
    * 处理 Exception 异常
    *
    * @parame
    * @param e 异常
    * @return
    */
    @ExceptionHandler(value = Exception.class)
    public ResponseEntity exceptionHandler(Exception e) {
    log.error("服务错误:", e);
    return ResponseEntity.fail(200, "服务出错");
    }

    /**
    * 处理 BusinessException 异常
    *
    * @param e
    * @param e 异常
    * @return
    */
    @ExceptionHandler(value = QDSException.class)
    public ResponseEntity businessExceptionHandler(QDSException e) {
    log.error("业务异常。code:" + e.getCode() + "msg:" + e.getMsg());
    return ResponseEntity.fail(e.getCode(), e.getMsg());
    }
    }
     

    2.2 扩展一下 @RestControllerAdvice还可以指定拦截哪些

     



    2.3创建一个异常返回的实体bean

    
    
    @Data
    public class ResponseEntity implements Serializable {
    private Integer code;
    private String msg;
    private Object data;

    public ResponseEntity() {
    }


    public ResponseEntity(Integer code, String msg, Object data) {
    this.code = code;
    this.msg = msg;
    this.data = data;
    }

    public ResponseEntity( String msg,Object data) {
    this.msg = msg;
    this.data = data;
    }
    public ResponseEntity( Integer code,String msg) {
    this.code = code;
    this.msg = msg;
    }

    public static ResponseEntity success(String msg,String data) {
    return SUCCESS(msg,data);
    }
    public static ResponseEntity fail(Integer code,String msg) {
    return FAIL(code,msg);
    }

    public static ResponseEntity SUCCESS(String msg,Object data) {
    return new ResponseEntity(msg,data);
    }
    public static ResponseEntity FAIL(Integer code,String msg) {
    return new ResponseEntity(code,msg);
    }
    }


    2.3创建一个自定义异常类

    @Data
    public class QDSException extends RuntimeException {
    private Integer code;
    private String msg;
    private Object data;

    public QDSException(String msg) {
    this.msg= msg;
    }
    public QDSException(Integer code,String msg) {
    this.code = code;
    this.msg= msg;
    }

    public QDSException(Integer code, String msg, Object data) {
    this.code = code;
    this.msg = msg;
    this.data = data;
    }
    }
     

    2.4 接下来我们postman测试一下就可以了

    @RestController
    public class MyController {

    @RequestMapping(value = "/test2")
    public ResponseEntity test2() {
    throw new QDSException(5005,"错误");
    }
    }

    2.5 如果我们抛出没有拦截的异常打印出堆栈信息

    
    
  • 相关阅读:
    微信小程序保存图片功能实现
    小程序清除缓存功能如何实现
    小程序自定义函数—数字千位转换
    小程序身份证号检测函数
    小程序 的 textarea 组件 层级问题如何解决
    Markdown 语法背一下咯
    跨域了解一下?
    sort命令的k选项大讨论【转】
    Shell脚本中实现切换用户并执行命令操作【转】
    Ansible Tower系列 四(使用tower执行一个命令)【转】
  • 原文地址:https://www.cnblogs.com/bt2882/p/12916104.html
Copyright © 2011-2022 走看看