Java - 链式异常
在 Java 中,当程序的正常流程被中断时,就会发生异常,导致程序停止。链式异常有助于将一个异常与另一个异常关联起来,其中一个异常被视为另一个异常的原因。
理解链式异常
链式异常是这样关联的,即前一个异常导致链中的每个异常。链式异常有助于我们调试错误并找出错误的根本原因。
例如
考虑一个银行系统中的情况,用户尝试转账。当用户登录时,登录成功,但事务数据库连接失败,从而抛出 SQLException。
在这里,transferMoney() 方法隐藏了 SQLException,因为它是低级异常。然后,它将该 SQLException 包装成一个名为 TransactionFailedException 的自定义异常。
SQLException 是根本原因,而 TransactionFailedException 是 SQLException 的链式异常。
由 Throwable 类支持
In Java 中,Throwable 类提供了 构造函数 和 方法,以支持链式异常。
构造函数
以下是 Throwable 类支持的两个构造函数 −
- Throwable(Throwable cause) − cause 是当前异常。
- Throwable(String msg, Throwable cause) − msg 是异常消息,cause 是当前异常。
方法
以下是 Throwable 类支持的两个方法 −
- getCause() − 该方法返回实际的 cause。
- initCause() − 该方法为调用的异常设置 cause。
示例 1
在以下示例中,我们在 test 方法中引发一个 ArithmeticException,然后将该 ArithmeticException 包装在自定义异常 ApplicationException 中并抛出。这演示了 Java 中的链式异常 −
public class Tester {
public static void main(String[] args) {
try {
test();
} catch (ApplicationException e) {
e.printStackTrace();
}
}
public static void test() throws ApplicationException {
try {
int a = 0;
int b = 1;
System.out.println(b / a);
} catch (Exception e) {
throw new ApplicationException("Chained Exception",e);
}
}
}
class ApplicationException extends Exception {
public ApplicationException(String message, Exception cause) {
super(message, cause);
}
}
输出
ApplicationException: Chained Exception at Tester.test(Tester.java:15) at Tester.main(Tester.java:4) Caused by: java.lang.ArithmeticException: / by zero at Tester.test(Tester.java:13) ... 1 more
示例 2
在以下示例中,我们在 test 方法中引发一个 NullPointerException,然后将该 NullPointerException 包装在自定义异常 DemoException 中并抛出。这演示了 Java 中的链式异常 −
public class Tester {
public static void main(String[] args) {
try {
test();
} catch (DemoException e) {
e.printStackTrace();
}
}
public static void test() throws DemoException {
try {
String str = null;
System.out.println(str.length());
} catch (Exception e) {
throw new DemoException("Chained Exception", e);
}
}
}
class DemoException extends Exception {
public DemoException(String message, Exception cause) {
super(message, cause);
}
}
输出
DemoException: Chained Exception at Tester.test(Tester.java:14) at Tester.main(Tester.java:4) Caused by: java.lang.NullPointerException: Cannot invoke "String.length()" because "<local0>" is null at Tester.test(Tester.java:12) ... 1 more