【问题标题】:Exclusion from general-purpose exception chaining facility in 'remote' exceptions从“远程”异常中的通用异常链工具中排除
【发布时间】:2012-07-02 18:45:09
【问题描述】:

考虑任何“远程”例外情况:
javax.jms.JMSExceptionjava.rmi.RemoteException
两者都通过具有 detaillinked 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())。这可以通过调用超级构造函数来简单地实现。

谢谢。

【问题讨论】:

    标签: java jms rmi rpc


    【解决方案1】:

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

    【讨论】:

    • 但是在 1.4 之前它并没有在RemoteException 中填充真正的原因。
    • @GergelySzilagyi 同意,但为什么是“但是”?这只是加强了答案。 (a) 行为不是这些异常类所独有的; (b) 在 1.4 之前,这些类中甚至不存在这种行为。在这两种情况下,问题都是基于错误的前提。
    【解决方案2】:

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

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

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

    编辑:

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

    【讨论】:

    • 感谢您的评论 Gergely Szilagyi!请您看一下更新后的问题。
    猜你喜欢
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多