Spring 全局异常处理

7 篇文章 0 订阅

全局异常处理除了是对业务处理运行情况的的统一反馈,也是业务处理发生异常的统一出口,可用来收集错误日志等相关操作。

方案说明:

  • 基于Spring做全局异常处理、Slf4J做日志输出接口。
  • 自定义异常通过code区别异常类型。
  • 自定义异常通过printLog来决定是否打印日志,默认不打印,避免大量冗余日志信息。其他运行时异常都打印error级别日志
  • 实际业务代码开发,原则上不允许做try...catch处理,所有错误使用全局异常统一捕获。除非相关业务非常明确不需要抛出异常。

技术实现

自定义异常类

public class AppException extends RuntimeException {
	// 错误码
    private String code;
    // 错误消息
    private String msg;
    // 是否打印日志(默认不打印)
    private boolean printLog;
  
    public AppException(String msg) {
        this.msg = msg;
    }

    public AppException(String msg, boolean printLog) {
        this.msg = msg;
        this.printLog = printLog;
    }

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

    public AppException(String msg, String code, boolean printLog) {
        this.code = msg;
        this.msg = code;
        this.printLog = printLog;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}

基于spring做全局异常处理:

@RestControllerAdvice
@Slf4j
public class WebExceptionHandler {

    /**
     * 自定义异常
     * @param e
     * @param requestWrapper
     * @return
     */
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(value = AppException.class)
    public Object exceptionHandler(AppException e, SecurityContextHolderAwareRequestWrapper requestWrapper) {
        // 打印日志
        if(e.isPrintLog()){
            log.error(e.getMessage(), e);
        }
        // 返回错误消息
        // ... return error msg
    }

    /**
     * 受检查异常
     * @param e
     * @param requestWrapper
     * @return
     */
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(value = Exception.class)
    public Object exceptionHandler(Exception e, SecurityContextHolderAwareRequestWrapper requestWrapper) {
        // 打印日志
        log.error(e.getMessage(), e);
        // 返回错误消息
        // ... return error msg
    }

    /**
     * 运行时异常
     * @param e
     * @param requestWrapper
     * @return
     */
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(value = RuntimeException.class)
    public Object exceptionHandler(RuntimeException e, SecurityContextHolderAwareRequestWrapper requestWrapper) {
        // 打印日志
        log.error(e.getMessage(), e);
        // 返回错误消息
        // ... return error msg
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值