2012-07-02 37 views
0

考虑任意的​​“远程”例外:
javax.jms.JMSExceptionjava.rmi.RemoteException
既从异常链通过的共用图案排除具有细节联异常属性。
当你打印堆栈轨迹包含这些例外之一时,你会得到修剪堆栈轨迹。要获得完整堆栈跟踪,您需要额外跳舞与手鼓。排除在“远程”例外链设施

是什么原因远程例外设计这种方式?

编辑:

我浏览的Java 1.6.0_26来源。看看java.rmi.RemoteException的两个参数构造函数public RemoteException(String s, Throwable cause)。你可以看到下面的代码initCause(null); // Disallow subsequent initCause。这似乎是Java SE 6中有意识的决定。
但是按照common practiceinitCause()它的宏大目的是构造异常链条
我不记得来源,但我相信有关创建自定义异常的最佳实践:
1.公开所有超类
2的构造并不制动例外连锁(调用Throwable.initCause()在也就是说)。这可以简单地通过调用超级构造函数来实现。

谢谢。

回答

0

你的问题是基于一个错误的前提。从Throwable以上的每个例外都有一个getCause()方法。

+0

更正,但1.4之前它没有填充RemoteException中的真正原因。 –

+0

@GergelySzilagyi同意但为什么'但'?这只是强化了答案。 (a)这些例外类别的行为并非唯一; (b)在1.4之前,这些类别中甚至没有这种行为。在这两种情况下,问题都是基于错误的前提。 – EJP

1

猜猜它的时间来更新你的java :)

版本1.4开始,此异常已经更新,符合通用异常链机制。现在可以通过Throwable.getCause()方法以及前面提到的“遗留字段”来访问可能在构建时提供并通过公共详细信息字段访问的“包装远程异常”。

http://docs.oracle.com/javase/1.5.0/docs/api/java/rmi/RemoteException.html

编辑:

,并回答你的问题,以及:这是一个糟糕的设计决策,这得到了在1.4

+0

感谢您的评论Gergely Szilagyi!你能否看看更新后的问题。 –