在“远程”例外中排除了通用异常链设施

时间:2012-07-02 10:53:29

标签: java jms rmi rpc

考虑任何'远程'例外情况:
javax.jms.JMSExceptionjava.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())。这可以通过调用超级构造函数来实现。

感谢。

2 个答案:

答案 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()方法。