考虑任何'远程'例外情况:
javax.jms.JMSException
或java.rmi.RemoteException
两者都通过 detail 或链接的异常属性从异常链接的常见模式中排除。
当您打印包含此异常之一的堆栈跟踪时,您将获得修剪堆栈跟踪。要获得完整的堆栈跟踪,您需要额外与铃鼓共舞。
以这种方式设计远程例外的原因是什么?
编辑:
我正在浏览java 1.6.0_26的来源。查看public RemoteException(String s, Throwable cause)
的两个参数构造函数java.rmi.RemoteException
。您可以看到下一个代码initCause(null); // Disallow subsequent initCause
。这似乎是Java SE 6中有意做出的决定。
但是根据common practice initCause()
,构建例外链的目的很明显!
我不记得来源,但我对创建自定义异常的最佳做法充满信心:
1.揭露超级班的所有建设者
2.不要制动例外链(换句话说,请拨打Throwable.initCause()
)。这可以通过调用超级构造函数来实现。
感谢。
答案 0 :(得分:1)
猜猜是时候更新你的java了:)
从版本1.4开始,此异常已经过改进,以符合通用异常链机制。可以在构造时提供并通过公共细节字段访问的“包装的远程异常”现在称为原因,并且可以通过Throwable.getCause()方法以及前述的“遗留字段”来访问。
http://docs.oracle.com/javase/1.5.0/docs/api/java/rmi/RemoteException.html
编辑:
并回答你的问题:这是一个糟糕的设计决定,在1.4
中得到纠正答案 1 :(得分:0)
你的问题是基于错误的前提。 Throwable
以上的每个例外都有一个getCause()方法。