全局异常统一处理

package com.miu.web.configuration;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 */
@ControllerAdvice
public class ExceptionConfig {

    private final Logger log = LoggerFactory.getLogger(ExceptionConfig.class);

    /**
     * 处理业务异常
     *
     * @param ex
     * @return
     */
    @ExceptionHandler(BaseException.class)
    @ResponseBody
    public Object handleMallException(BaseException ex) {
        log.error("统一处理系统异常-业务异常:", ex);
        return Result.error(ex.getMessage(), ex.getStatus().toString());
    }

    /**
     * 处理业务异常
     *
     * @param ex 异常
     * @return Object
     */
    @ExceptionHandler(BindException.class)
    @ResponseBody
    public Object handleMallException(BindException ex) {
        log.error("统一处理系统异常-业务参数校验异常:", ex);
        return new Result<>(ex.getFieldError().getDefaultMessage(), String.valueOf(ResponseStatus.PARAMETER_ILLEGAL.getCode()), false, "");
    }

    /**
     * 处理业务异常
     *
     * @param ex 异常
     * @return Object
     */
    @ExceptionHandler(BusinessValidateException.class)
    @ResponseBody
    public Object handleMallException(BusinessValidateException ex) {
        log.error("统一处理系统异常-业务校验异常:", ex);
        return new Result<>(ex.getMessage(), String.valueOf(ex.getStatus().getCode()), false, "");
    }

    /**
     * 处理系统异常
     *
     * @param ex
     * @return
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Object handleException(Exception ex) {
        log.error("统一处理系统异常-报错信息为:", ex);
        return Result.error("system","system");
    }
}


先用@ControllerAdvice搭配@ExceptionHandler来使用,捕获全局异常。



/**
 * 自定义异常
 *
 */
public class BaseException extends RuntimeException {
    //状态码
    private ResponseStatus status = ResponseStatus.UNKNOWN_ERROR;
    //附加信息
    private String additionMsg = "";

    public BaseException(ResponseStatus status, String additionMsg){
        super(String.format(status.getMessageFormat(),additionMsg));
        this.status = status;
        this.additionMsg = additionMsg;
    }

    public BaseException(ResponseStatus status){
        super(String.format(status.getMessageFormat(),""));
        this.status = status;
    }

    public BaseException(String additionMsg){
        super(String.format(ResponseStatus.UNKNOWN_ERROR.getMessageFormat(),additionMsg));
        this.additionMsg = additionMsg;
    }

    public ResponseStatus getStatus() {
        return status;
    }

    public void setStatus(ResponseStatus status) {
        this.status = status;
    }

    public String getAdditionMsg() {
        return additionMsg;
    }

    public void setAdditionMsg(String additionMsg) {
        this.additionMsg = additionMsg;
    }
}


/**
 * @date 2022-10-31 15:01
 */
public class BusinessValidateException extends BaseException {

    /**
     * 状态码
     */
    private ResponseStatus status = ResponseStatus.UNKNOWN_ERROR;

    /**
     * 附加信息
     */
    private String additionMsg = "";

    public BusinessValidateException(ResponseStatus status, String additionMsg) {
        super(String.format(status.getMessageFormat(), additionMsg));
        this.status = status;
        this.additionMsg = additionMsg;
    }

    public BusinessValidateException(ResponseStatus status) {
        super(String.format(status.getMessageFormat(), ""));
        this.status = status;
    }

    public BusinessValidateException(String additionMsg) {
        super(String.format(ResponseStatus.UNKNOWN_ERROR.getMessageFormat(), additionMsg));
        this.additionMsg = additionMsg;
    }

    public static void throwException(ResponseStatus status) {
        throw new BaseException(status);
    }

    public static void throwException(String additionMsg) {
        throw new BaseException(additionMsg);
    }

    public static void throwException(ResponseStatus status, String additionMsg) {
        throw new BaseException(status, additionMsg);
    }

    public ResponseStatus getStatus() {
        return status;
    }

    public void setStatus(ResponseStatus status) {
        this.status = status;
    }

    public String getAdditionMsg() {
        return additionMsg;
    }

    public void setAdditionMsg(String additionMsg) {
        this.additionMsg = additionMsg;
    }
}


/**
 * @author
 */
public enum ResponseStatus {
    SUCCESS(200, "成功"),
    TOKEN_INVALID(10401, "令牌无效"),
    SIGN_INVALID(10402, "签名不匹配"),
    UNAUTHORIZED(20001, "资源未授权:请刷新页面后重试"),
    PARAMETER_ILLEGAL(30001, "参数不合法:%s"),
    REQUEST_ERROR(30002, "请求失败:%s"),
    BUSINESS_PARAM_ERROR(30003, "%s"),
    UNKNOWN_ERROR(40001, "%s"),

    RPC_ERROR(50001, "服务返回异常:%s"),
    BUSINESS_EXCEPTION(60001, "业务异常:%s"),

    STOCK_STATUS_SEND_ERROR(60002, "发件扫描库存状态异常"),
    STOCK_STATUS_ARRIVE_ERROR(60003, "到件扫描库存状态异常"),

    ;


    private int code;
    private String messageFormat;

    ResponseStatus(int code, String messageFormat) {
        this.code = code;
        this.messageFormat = messageFormat;
    }

    public int getCode() {
        return code;
    }

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

    public String getMessageFormat() {
        return messageFormat;
    }

    public void setMessageFormat(String messageFormat) {
        this.messageFormat = messageFormat;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端从入门到精通

你的鼓励是我最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值