抑制异常和原因之间的区别

3

我有自己的异常,由我的类BrowserException抛出。
这可能是因为一些内部问题,例如UnsupporderEncodingException。

现在我有两个选项:

  1. Throwable.addSuppressed(Throwable exception)
  2. Throwable.initCause(Throwable cause)

在异常中,抑制异常和原因之间有什么区别?
我何时更喜欢使用它们中的每一个?


请查看此链接 https://dev59.com/hmsz5IYBdhLWcg3wg4Gv 以及cause。 - Lokesh Pandey
1个回答

8
抑制异常是指如果没有其他异常发生就会发生的异常。我只知道一种情况会出现这种情况,即使用try-with-resources语句时。JLS(14.20.3)中说:
资源的关闭顺序与初始化顺序相反。仅当资源初始化为非null值时,才会关闭资源。一个资源的关闭异常不会阻止其他资源的关闭。如果在初始化程序、try块或资源关闭之前抛出了异常,则该异常将被抑制。
因此,假设您正在尝试写入USB存储器上的文件流,并且已经拔掉了USB存储器。write调用会抛出IOException异常,但close调用也会抛出异常,因为它正在尝试刷新缓冲区。调用者将看到write调用引发的原始异常,但他们将能够获取由close引发的异常作为抑制异常。
如果一个异常实际上是将一个异常转换成另一个异常的结果,那么它就有了一个“cause”。假设您正在编写一个与本地文件系统通信的SQL系统。您的JDBC驱动程序方法只能抛出“SQLException”,那么如果底层代码由于无法从磁盘读取而抛出“IOException”该怎么办?您可能希望在“SQLException”中显示“IOException”的详细信息,因此将其传递给“SQLException”的构造函数-“IOException”是异常的“cause”。您不太可能需要自己添加被压制的异常,但是创建一个由另一个异常引起的异常(通常通过构造函数而不是通过调用“initCause”)是相当普遍的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接