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

Posted

技术标签:

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

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

现在我有两个选择:

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

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

【问题讨论】:

查看此链接 ***.com/questions/7849416/… 和原因 【参考方案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)是相当常见的。

【讨论】:

以上是关于抑制异常和原因之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

引发异常“这是错误”和引发“这是错误”之间的区别? [复制]

Windows 和控制台应用程序之间的区别

NoClassDefFoundError 和 ClassNotFoundException 之间的原因和区别是啥?

rs232和rs485的区别

关于232和485总线的区别

NoClassDefFoundError 和 ClassNotFoundException 区别?