如何编写链式异常 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 类的主要内容,如果未能解决你的问题,请参考以下文章

java中如何自定义异常

如何编写BasePage类

java 如何让用户自定义函数呢?

如何用Java程序来编写一个异常?

jQuery插件编写及链式编程模型小结

《深入理解Java虚拟机》- JVM如何进行异常处理