【Exception】自定义异常类

自定义异常类分三步:

  1. 自定义枚举类
  2. 自定义异常类
  3. 测试

自定义枚举类:

为什么要自定义枚举类?

因为在自定义异常时,常常是自己在写 异常信息说明,这可能会导致这样的情况发生:同一个场景问题,可能会出现多个不同的描述。如,前台传参错误,可能会描述为:参数错误、name 参数没传…等。所以,为了 统一异常信息说明,就用到了枚举类。

所以正常情况下,异常类的代码如下:

public class MyException extends RuntimeException {

    private Integer code;
    private String msg;

	// 扩展的构造方法
    public MyException(CodeStatusEnum codeStatusEnum) {
        super(codeStatusEnum.getMsg());
        this.code = codeStatusEnum.getCode();
        this.msg = codeStatusEnum.getMsg();
    }
    
    //getter/setter
}

但考虑到这样的情况发生,一个系统中可能用到了很多个枚举类、那上面的入参构造方法就无法满足了。

所以,这里的解决方案是:将枚举类向上抽象出一个接口,然后,枚举类去实现它。

自定义接口:

public interface IErrorCode {
	// 获取状态码
    int getCode();
    // 获取异常信息
    String getMsg();
}

自定义枚举类:

public enum CodeStatusEnum implements IErrorCode{

    EMPTY_PARAM(1001, "参数为空")
    ,
    ERROR_PARAM(1002, "参数错误")
    ,
    EMPTY_OBJECT(1003, "对象为空")
    ;

    private Integer code;
    private String msg;

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

	// 实现了接口中的方法
    @Override
    public int getCode() {
        return code;
    }

	// 实现了接口中的方法
    @Override
    public String getMsg() {
        return msg;
    }
}

其中,枚举类里面的枚举实例由实际情况而定哈。需要新的枚举状态可以直接添加


自定义异常类:

理解 Error、RuntimeException(运行时,虚拟机报的错)和非 RuntimeException(编译时,编译器找出的错)

  1. Java中异常均继承自 Throwable 类,它有两个重要的直接子类:Error、Exception;
  2. Java错误 Error,大部分是由虚拟机爆出来的错误,是程序无法处理的错误。如:OutOfMemoryError,当 JVM 需要更多内存空间而得不到满足时,就会爆出 OutOfMemoryError;
  3. Exception 异常,分为运行时异常 RuntimeException、非运行时异常。RuntimeException:编译器不会帮你自动检查,当你运行程序时,虚拟机才会给你报出错误让你去处理,这个往往是我们编码逻辑或不规范导致的;非RuntimeException 是在代码书写时,编译器给你检查提示你要进行 try-catch 或 throws 处理
public class MyException extends RuntimeException {

    private Integer code;
    private String msg;

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

    public MyException(IErrorCode errorCode) {
        super(errorCode.getMsg());
        this.code = errorCode.getCode();
        this.msg = errorCode.getMsg();
    }
	//getter/setter
}

自定义异常时,需要做两个步骤:

  1. 新建一个异常类,然后继承 Exception/RuntimeException。如果在编译时就需要处理异常,那就继承 Exception。不过,一般都是继承 RuntimeException
  2. 给异常类添加相应的构造方法

测试

public class UserService {

    public User getUser() {
    	// 这里通过数据库查询,将返回的值赋给 user 变量。这里为了就简,就没涉及到数据库查询了
        User user = null;
        // 对返参进行校验,如果为空,则抛出一个自定义异常对象
        if (null == user) {
        	// 当对象为空时,就抛出一个异常
            throw new MyException(CodeStatusEnum.EMPTY_OBJECT);
        }
        return user;
    }
}

public class Test {

    public static void main(String[] args) {
        UserService userService = new UserService();
        try {
        	// 运行时进行捕获
            User user = userService.getUser();
        } catch (MyException e) {
        	// 这里可以将异常信息进行统一封装,返回给前端
            System.out.println(e.getMsg());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

这里就简单介绍下,如何自定义异常。

你可能感兴趣的:(Java)