【问题标题】:Difference between suppressedException and cause抑制异常和原因之间的区别
【发布时间】:2017-10-11 07:06:50
【问题描述】:

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

现在我有两个选择:

  1. Throwable.addSuppressed(可抛出异常)
  2. Throwable.initCause(Throwable 原因)

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

【问题讨论】:

标签: java exception


【解决方案1】:

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

资源的关闭顺序与它们初始化时的顺序相反。仅当资源初始化为非空值时才关闭资源。关闭一个资源的异常不会阻止关闭其他资源。如果之前由初始化程序、try 块或资源关闭引发了异常,则抑制此类异常。

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

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

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

【讨论】:

    猜你喜欢
    • 2019-11-14
    • 2011-04-16
    • 2017-05-27
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多