源码解析
状态信息
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 方法:获取异常的发生顺序并打印(开发和调试阶段用来显示异常信息,帮助开发者找出错误)。
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