suppressException和cause之间的区别

时间:2017-10-11 07:06:51

标签: java exception

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

现在我有两个选择:

  1. Throwable.addSuppressed(Throwable exception)
  2. Throwable.initCause(Throwable cause)
  3. 在例外情况下,suppressException和cause之间有什么区别?
    我什么时候喜欢使用它们?

1 个答案:

答案 0 :(得分:5)

如果没有发生另一个异常,则抑制异常是 发生的异常。我只知道发生这种情况的一种情况,即使用try-with-resources语句。 JLS (14.20.3)说:

  

资源以与初始化资源相反的顺序关闭。仅当资源初始化为非空值时才关闭资源。关闭一个资源的例外不会阻止关闭其他资源。如果先前由初始化程序,try块或资源关闭引发异常,则会出现抑制这样的异常。

因此,假设您正在尝试写入USB记忆棒上的文件流,并删除USB记忆棒。 write调用会引发IOException - 但close调用也是如此,因为它正在尝试刷新缓冲区。来自write调用的原始异常将是调用者看到的异常,但是他们将能够获得close抛出的异常作为被抑制的异常。

如果异常有原因,如果它实际上是将一个异常转换为另一个异常的结果。假设您正在编写与本地文件系统对话的SQL系统。您的JDBC驱动程序方法只能抛出SQLException,那么如果底层代码抛出IOException因为无法从磁盘读取,您会怎么做?您可能希望IOException中显示SQLException的详细信息,因此您将其传递到SQLException的构造函数中 - IOException原因< / em>的例外。

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