【发布时间】:2012-07-02 18:45:09
【问题描述】:
考虑任何“远程”例外情况:javax.jms.JMSException 或 java.rmi.RemoteException
两者都通过具有 detail 或 linked exception 属性从常见的异常链接模式中排除。
当您打印包含此异常之一的堆栈跟踪时,您将获得修剪的堆栈跟踪。要获得 完整 堆栈跟踪,您需要额外的手鼓跳舞。
远程异常以这种方式设计的原因是什么?
编辑:
我正在浏览 java 1.6.0_26 的源代码。查看java.rmi.RemoteException 的两个参数构造函数public RemoteException(String s, Throwable cause)。你可以看到下一个代码initCause(null); // Disallow subsequent initCause。这似乎是 Java SE 6 中有意做出的决定。
但是根据 common practice initCause() 的说法,其主要目的是构建异常链!
我不记得来源,但我对创建自定义异常的最佳实践充满信心:
1. 暴露超类的所有构造函数
2. 不要制动异常链(换句话说,调用Throwable.initCause())。这可以通过调用超级构造函数来简单地实现。
谢谢。
【问题讨论】: