如何编写链式异常 Java 类
Posted
技术标签:
【中文标题】如何编写链式异常 Java 类【英文标题】:How to write Chained Exception Java classes 【发布时间】:2015-09-17 17:42:47 【问题描述】:具体来说,应该重写哪些构造函数以将异常限定为chainable?
Throwable(Throwable cause)
、Throwable(String message, Throwable cause)
,还是两者兼有?
资源:
http://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html https://docs.oracle.com/javase/tutorial/essential/exceptions/chained.html
以下示例展示了如何使用链式异常:
try
catch (IOException e)
throw new SampleException("Other IOException", e);
【问题讨论】:
伙计们,你们很快……更新了主题并为问题添加了一些上下文。 【参考方案1】:不清楚这里的“可链接”是什么意思。
但是,鉴于您提供的链接,我假设您的意思是 Throwable
有另一个 Throwable
作为原因。
在这种情况下,您别无选择,只能使用适当的构造函数;例如:
public class Root
extends Exception
public Root(final String msg, final Throwable cause)
super(msg, cause);
另一种鲜为人知的解决方案是从 Java 7 开始就存在,它是“抑制”异常。见this link。
这意味着您应该首先定义“链式异常”的含义。就其性质而言,一个例外几乎是“最终的”。将异常嵌入到其他异常中的需求很少见,但并非闻所未闻(至于被抑制的异常,请参见 here 的示例)
所以,首先要定义您的用例!
【讨论】:
抑制异常非常酷。谢谢。因此,似乎我们可以使用这两个构造函数中的任何一个来获取chained exceptions,以“getCause()
返回导致当前异常的异常,initCause()
设置当前异常的原因。”
不完全。如果您抑制异常,则不会将其视为“原因”。在这一点上,我相信最好的方法是进行试验,看看什么最适合你。就个人而言,由于抑制异常的出现,我很少看到需要initCause()
,但你的里程可能会有所不同;)以上是关于如何编写链式异常 Java 类的主要内容,如果未能解决你的问题,请参考以下文章