Java实现自定义异常返回

概述

实际业务开发中,产生的错误信息,并不需要返回给用户,错误信息供开发人员排查错误即可,
对于用户而言,只需要抛出提示错误即可,这就需要对异常错误信息进行统一封装
返回统一信息定义可看上一篇文章:
[Java实现统一封装格式返回对象]
主要步骤如下:
1、自定义异常类
2、自定义拦截器异常处理

自定义异常类

public class BaseException extends RuntimeException {
    private final IRetCode retCode;
    protected Object[] args;
    protected Object obj;

    public BaseException(String message) {
        super(message);
        this.retCode = CommonRetEnum.FAIL;
    }

    public BaseException(IRetCode retCode) {
        super(retCode.getMsg());
        this.retCode = retCode;
    }

    public BaseException(IRetCode retCode, Throwable cause) {
        super(cause);
        this.retCode = retCode;
    }
    public BaseException(IRetCode responseEnum, Object obj) {
        super(responseEnum.getMsg());
        this.retCode = responseEnum;
        this.obj = obj;
    }

    public BaseException(IRetCode responseEnum, Object obj, Object[] args) {
        super(responseEnum.getMsg());
        this.retCode = responseEnum;
        this.obj = obj;
        this.args = args;
    }

    public Throwable fillInStackTrace() {
        return this;
    }

    public IRetCode getRetCode() {
        return this.retCode;
    }

    public Object[] getArgs() {
        return this.args;
    }
     public Object getObj() {
        return this.obj;
    }

    public String toString() {
        return "BaseException(retCode=" + this.getRetCode() + ", args=" + Arrays.deepToString(this.getArgs()) + ", obj=" + this.getObj() + ")";
    }
}

自定义异常拦截类

/**
 * 全局异常拦截
 **/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionAdvice {

    @Autowired
    private I18nMessageSource i18nMessageSource;

    public GlobalExceptionAdvice() {
    }
    
 	@ExceptionHandler({BaseException.class})
    public RetObj handBaseException(BaseException e) {
        IRetCode retCode = e.getRetCode();
        String msg = e.getMessage();
        Object obj = e.getObj();
        Object[] args = e.getArgs();
        if (StringUtil.isBlank(msg)) {
            msg = retCode.getMsg();
        }
        return this.getBaseRet(retCode, args, obj, msg);
    }
    
    @ExceptionHandler({Exception.class})
    public RetObj handleException(Exception e, HttpServletRequest request) {
        return this.getSystemRet(request, CommonRetEnum.EXCEPTION, e);
    }

    private <T extends Throwable> RetObj getSystemRet(HttpServletRequest request, IRetCode retEnum, T ex) {
        log.error("@@服务异常,Capture Exception By GlobalExceptionHandler: requestUrl: {} Code: {} Detail: {}", new Object[]{request.getRequestURL(), retEnum, ExceptionUtil.getStackTraceAsString(ex)});
        String msg = this.getMessage(CommonRetEnum.EXCEPTION, (Object[]) null);
        return RetObj.fail(CommonRetEnum.EXCEPTION, msg);
    }
    
    private RetObj getBaseRet(IRetCode retCode, Object[] args, Object obj, String errorMsg) {
        String msg = this.getMessage(retCode, args);
        if (StringUtil.isNotBlank(errorMsg)) {
            msg = errorMsg;
        }
        return RetObj.fail(retCode.getCode(), msg, obj);
    }

    public String getMessage(IRetCode iRetCode, Object[] args) {
        String code = "ret." + iRetCode.getCode() + "." + iRetCode.getMsg();
        String message = this.i18nMessageSource.getMessage(code, args);
        return StrUtil.isBlank(message) ? iRetCode.getMsg() : message;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值