0

考虑任何“远程”异常:
javax.jms.JMSExceptionjava.rmi.RemoteException
两者都通过具有详细链接异常属性而从异常链接的常见模式中排除。
当您打印包含此异常之一的堆栈跟踪时,您将获得修剪的堆栈跟踪。要获得完整的堆栈跟踪,您需要额外的手鼓跳舞。

以这种方式设计 远程异常的原因是什么?

编辑:

我正在浏览 java 1.6.0_26 的源代码。查看 的两个参数构造函数public RemoteException(String s, Throwable cause)java.rmi.RemoteException你可以看到下一个代码initCause(null); // Disallow subsequent initCause。这似乎是 Java SE 6 中有意做出的决定。
但是按照惯例,构建 异常链initCause()有它的宏伟目的! 我不记得来源,但我对创建自定义异常的最佳实践充满信心: 1. 公开超类 2 的所有构造函数。不要制动异常链(换句话说,调用)。这可以通过调用超级构造函数来简单地实现。


Throwable.initCause()

谢谢。

4

2 回答 2

1

猜猜是时候更新你的java了:)

从 1.4 版开始,此异常已被改进以符合通用异常链机制。可以在构建时提供并通过公共详细信息字段访问的“包装的远程异常”现在称为原因,可以通过 Throwable.getCause() 方法以及上述“遗留字段”进行访问。

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

编辑:

并回答你的问题:这是一个糟糕的设计决定,在 1.4 中得到了纠正

于 2012-07-02T23:50:04.190 回答
0

你的问题是基于一个错误的前提。Throwable向上的每个异常都有一个getCause()方法。

于 2012-07-02T23:43:10.063 回答