抑制异常和原因之间的区别
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
)是相当常见的。
【讨论】:
以上是关于抑制异常和原因之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
引发异常“这是错误”和引发“这是错误”之间的区别? [复制]