Exception 类

2022-08-05 21:47:28 浏览数 (2)

源码解析

状态信息

Throwable / Exception 类是有状态的(因此 Throwable 是接口而不能是类),记录了四个信息:

代码语言:javascript复制
private transient Object backtrace;                          // 栈的回溯点
private String detailMessage;                                // 异常的信息:在创建异常时备注
private Throwable cause = this;                              // 异常的原因:导致该异常的异常,默认为自身
private StackTraceElement[] stackTrace = UNASSIGNED_STACK;   // 异常的发生顺序:以栈的形式存储Copy to clipboardErrorCopied

构造方法

Throwable / Exception 类含有四个构造方法,在创建时可以记录异常信息:

代码语言:javascript复制
throw new Exception();                           // 默认
throw new Exception("message");                  // 记录异常信息
throw new Exception(e);                          // 记录异常原因
throw new Exception("message", e);               // 记录详细信息和异常原因Copy to clipboardErrorCopied

常用方法

Throwable / Exception 类定义了多种常用方法用于获取异常数据,常用的有:

  • getMessage 方法:获取异常的信息。
  • getStackTrace 方法:获取的异常发生顺序。
  • printStackTrace 方法:获取异常的发生顺序并打印(开发和调试阶段用来显示异常信息,帮助开发者找出错误)。
代码语言:javascript复制
catch(Exception e){
    System.out.println(e.getMessage());
    e.printStacTrace();                           
}Copy to clipboardErrorCopied

自定义异常

我们也可以通过继承并重写 Exception / RuntimeException 类的方式,自定义异常类并使用。

代码语言:javascript复制
// 自定义异常,重写方法可任选
class MyException extends Exception {
    @Override
    public MyException() {
        super();
    }
    @Override
    public MyException(String message) {
        super(message);
    } 
    @Override
    public MyException(String message, Throwable cause){
        super(message,cause);
    }
    @Override
    public MyException(Throwable cause) {
        super(cause);
    }
}Copy to clipboardErrorCopied

异常转译

在项目开发过程中,当 Sevice/DAO 层出现如 SQLException 异常时,程序一般不会把底层的异常传到 controller 层。程序可以捕获原始异常,然后再抛出一个新的业务异常。

代码语言:javascript复制
catch(SQLException e){
    throw new MyException("SQL Error", e);
}
Copy to clipboardErrorCopied

0 人点赞