Java 中的链式异常

10 Sept 2024 | 4 分钟阅读

在 Java 中,链式异常是一种使程序员能够将一个异常与另一个异常关联起来的技术。通过提供关于特定异常的额外信息,可以更容易地进行调试。链式异常是通过将现有异常包装在新异常中来创建的,后者成为新异常的根本原因。

新异常可以提供额外信息,而原始异常包含实际的错误消息和堆栈跟踪。这使得确定和修复问题的根源更加容易。当一个异常是由另一个异常引起的时,链式异常尤其有用。

在 Java 中,链式异常是使用异常类的构造函数之一来创建的。

Throwable 类

Throwable 类中提供了支持链式异常的构造函数和方法。让我们首先看一下构造函数。

Throwable(Throwable cause): 一个 Java 构造函数,它创建一个具有指定原因异常的新异常对象。

Throwable(String desc, Throwable cause): 一个 Java 构造函数,它创建一个带有消息和原因的新 Throwable 对象。它允许链式异常并提供有关错误的更详细信息。

在 Java 中,以下 Throwable 类方法支持链式异常

getCause(): 它是 Throwable 类的一个 Java 方法,用于返回当前异常的原因。它允许访问触发当前异常抛出的异常或错误。

initCause() 方法: 确定调用异常的原因。

链式异常示例

文件名: ChainedExceptionExample.java

输出

Exception in thread "main" java.lang.RuntimeException: Exception at ChainedExceptionExample.main(ChainedExceptionExample.java:7)
Caused by: Java.lang.NullPointerException: It is actual cause of the exception at ChainedExceptionExample.main(ChainedExceptionExample.java:8)

带有和不带链式异常的示例

不带链式异常

文件名: NonChainedExceptionExample.java

输出

Enter a positive integer: -9
Invalid input: Number must be positive

带有链式异常

文件名: ChainedExceptionExample.java

输出

Enter a positive integer: -9
Exception in thread "main" java.lang.RuntimeException: Invalid input at ChainedExceptionExample.main(ChainedExceptionExample.java:17)
Caused by: Java.lang.IllegalArgumentException: Number must be positive at ChainedExceptionExample.main(ChainedExceptionExample.java:11)

非链式异常和链式异常之间的区别

非链式异常链式异常
发生异常并在发生点捕获,而无需参考异常的原始原因。异常的原始原因得以保留,并与当前异常一起报告。
缺乏对原始原因的引用可能会使调试和故障排除更具挑战性。链式异常为异常提供了更多上下文,并使其更容易识别和修复问题的根源。
适用于异常有限且易于识别的小型程序或简单系统在异常可能跨不同组件抛出的复杂的大型程序或系统中特别有用,因为它可以帮助识别问题首次发生的位置以及它如何在系统中传播