Java 链式异常怎么用?

文章导读
Previous Quiz Next 在 Java 中,当程序的正常流程被中断时,就会发生异常,导致程序停止。链式异常有助于将一个异常与另一个异常关联起来,其中一个异常被视为另一个异常的原因。
📋 目录
  1. A 理解链式异常
  2. B 由 Throwable 类支持
A A

Java - 链式异常



Previous
Quiz
Next

在 Java 中,当程序的正常流程被中断时,就会发生异常,导致程序停止。链式异常有助于将一个异常与另一个异常关联起来,其中一个异常被视为另一个异常的原因。

理解链式异常

链式异常是这样关联的,即前一个异常导致链中的每个异常。链式异常有助于我们调试错误并找出错误的根本原因。

例如

考虑一个银行系统中的情况,用户尝试转账。当用户登录时,登录成功,但事务数据库连接失败,从而抛出 SQLException

在这里,transferMoney() 方法隐藏了 SQLException,因为它是低级异常。然后,它将该 SQLException 包装成一个名为 TransactionFailedException 的自定义异常。

SQLException 是根本原因,而 TransactionFailedException 是 SQLException 的链式异常

Understanding Chained Exceptions

由 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