在实际开发中如何优雅的使用异常(Java)

关键字:枚举+自定义异常

适合学习群体:后端开发,Java初学者,面试应聘者。

异常码枚举

先定义一个异常码枚举处理

public enum ErrorCodeEnum {
    SYS_ERROR("SYS_ERROR","系统错误,请重写"),
    UNKOWN_ERROR("UNKOWN_SYS_ERROR","未知的系统异常"),
    SERVICE_INVOKE_FAIL("SERVICE_INVOKE_FAIL", "服务调用失败"),
    ILLEGAL_ARGS("ILLEGAL_ARGS", "参数校验错误"),
    ;

    /**
     * 结果异常
     */
    private String code;
    /**
     * 描述
     */
    private String decs;

    ErrorCodeEnum(String code, String decs) {
        this.code = code;
        this.decs = decs;
    }

    public static ErrorCodeEnum getByValue(String code){
        for (ErrorCodeEnum result : values()) {
            if (code.equals(result.getCode())){
                return result;
            }
        }
        return null;
    }

    public String getCode() {
        return code;
    }

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

    public String getDecs() {
        return decs;
    }

    public void setDecs(String decs) {
        this.decs = decs;
    }
}

一个通过code找枚举的方法
在这里插入图片描述

自定义异常

注意有个异常枚举
继承了RuntimeException

/**
 * 自定义异常
 */
public class KomaException extends RuntimeException {
    private static final long serialVersionUID = -8581672033133636908L;
    /*** 错误码枚举*/
    private ErrorCodeEnum errorCode;
    /**
     * 详细错误信息
     */
    private Map<String, String> errorMap = new HashMap<String, String>();
    /**
     * 带参构造器.
     *
     * @param errorCode
     */
    public KomaException(ErrorCodeEnum errorCode) {
        super(errorCode.getDecs());
        this.setErrorCode(errorCode);
    }
    /**
     * 带参构造器.
     *
     * @param errorCode
     * @param message
     */
    public KomaException(ErrorCodeEnum errorCode, String message) {
        super(message.isEmpty() ? errorCode.getDecs() : message);
        this.setErrorCode(errorCode);
    }

    /**
     * 带参构造器.
     *
     * @param errorCode
     * @param errorMap
     */
    public KomaException(ErrorCodeEnum errorCode, Map<String, String> errorMap) {
        this(errorCode);
        this.errorMap = errorMap;
    }
    /**
     * 带参构造器.
     *
     * @param message
     */
    public KomaException(String message) {
        super(message);
        this.setErrorCode(ErrorCodeEnum.UNKOWN_ERROR);
    }
    /**
     * Gets error code.
     *
     * @return the error code
     */
    public ErrorCodeEnum getErrorCode() {
        return errorCode;
    }
    /**
     * Sets error code.
     *
     * @param errorCode the error code
     */
    public void setErrorCode(ErrorCodeEnum errorCode) {
        this.errorCode = errorCode;
    }
    /**
     * Gets error map.
     *
     * @return the error map
     */
    public Map<String, String> getErrorMap() {
        return errorMap;
    }
    /**
     * Sets error map.
     *
     * @param errorMap the error map
     */
    public void setErrorMap(Map<String, String> errorMap) {
        this.errorMap = errorMap;
    }
    private static String findMessage(Map<String, String> errorMap) {
        if (errorMap.isEmpty()) {
            return null;
        }
        return errorMap.values().iterator().next();
    }
}

2个构造方法,还可以增加其他默认构造方法
一个完全根据异常码枚举的、一个是异常码枚举和异常描
在这里插入图片描述

测试类

这里的catch可以封装一个resut对象,把异常码、异常描述、成功与否封装进去

public class Test {
    public static void main(String[] args) {
        String name=null;
        int i=0;
        try{
            if (name==null){
                throw new KomaException(ErrorCodeEnum.ILLEGAL_ARGS);
            }
            if (i==0){
                throw new KomaException(ErrorCodeEnum.ILLEGAL_ARGS,"参数不能为0");

            }
        }catch (KomaException e){
            e.printStackTrace();
            System.out.println("异常码:"+e.getErrorCode().getCode());
            System.out.println("异常描述:"+e.getMessage());
        }
    }
}

异常码、异常信息都打出来了,定位问题非常方法
在这里插入图片描述

总结

定义异常码类就可以,如果业务非常复杂可以把异常码类多搞几个出来
项目中一个异常类够用了,通过不同异常码定义去区分业务异常
强烈建议开发时多定义异常码,越细越好,上了生产方便快速定位BUG
关键枚举异常码+自定义异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值