suppressException和原因之间的区别

问题描述:

我有我自己的异常,由我的类BrowserException抛出。
这可能是因为某些内部问题,即UnsupporderEncodingException。suppressException和原因之间的区别

现在我有两个选择:

  1. Throwable.addSuppressed(Throwable异常)
  2. Throwable.initCause(Throwable的原因)

在例外情况,就是suppressedException和事业之间的区别?
我什么时候会喜欢使用它们中的每一个?

+0

看到这个链接https://*.com/questions/7849416/what-is-a-suppressed-exception和因为 – Lokesh

被抑制的例外情况是将发生如果另一个异常未发生。我只知道发生这种情况的一种情况,这是与资源尝试的声明。 JLS (14.20.3)说:

资源以与它们初始化的顺序相反的顺序关闭。仅当资源初始化为非空值时才关闭资源。关闭一个资源时的异常并不妨碍关闭其他资源。如果以前由初始化程序,try块或资源关闭引发异常,则此例外是被抑制

因此,假设您试图写入USB存储棒上的文件流,并移除了USB存储棒。 write调用抛出一个IOException - 但调用close也是如此,因为它试图刷新缓冲区。来自write呼叫的原始例外将是呼叫者看到的那个例外,但他们将能够得到close抛出的例外,作为抑制性例外。

如果异常有一个原因如果它实际上是将一个异常转换为另一个异常的结果。假设你正在编写一个与本地文件系统交谈的SQL系统。您的JDBC驱动程序方法只能抛出SQLException,那么如果您的基础代码抛出IOException因为无法从磁盘中读取而执行什么操作?您可能希望IOException的细节在SQLException中可见,因此您将其传入构造函数SQLException - IOException原因的异常。

你不可能永远需要自己添加抑制异常,但创建一个由另一个异常(通常通过构造函数而不是调用initCause)引起的异常是相当普遍的。