Java JBoss4.2吞并了EJB异常原因的stacktrace,如何防止这种情况?

Java JBoss4.2吞并了EJB异常原因的stacktrace,如何防止这种情况?,java,exception-handling,jboss,Java,Exception Handling,Jboss,在JBoss4.2.2(JDK5上)中,我注意到了这种行为。是否有配置或其他方法来防止它 如果我有这样的代码: try { doSomething(); } catch (Exception e) { throw new EJBException(e); } 生成的堆栈跟踪(捕获并记录时)将是: NullPointerException没有堆栈跟踪。有没有一种方法可以防止堆栈跟踪被吞没,并将完整的堆栈跟踪作为由EJBException不可链接引起的事件的一部分 我不知道您的示例是否代表

在JBoss4.2.2(JDK5上)中,我注意到了这种行为。是否有配置或其他方法来防止它

如果我有这样的代码:

try {
  doSomething();
} catch (Exception e) {
  throw new EJBException(e);
}
生成的堆栈跟踪(捕获并记录时)将是:


NullPointerException没有堆栈跟踪。有没有一种方法可以防止堆栈跟踪被吞没,并将完整的堆栈跟踪作为由EJBException不可链接引起的事件的一部分


我不知道您的示例是否代表了您的真实代码,但我想问您为什么要捕获异常,将其包装为EJBException并重新引用它?这样做不会添加任何有意义的新信息。您的catch块甚至没有记录原始异常的最低限度。那么,为什么要抓呢?为什么不在方法签名中声明异常并让客户端处理它呢?我能想到的唯一好的理由是EJBException不是一个检查过的异常,因此您免除了客户捕获它的义务。但即使这样也很危险。我认为您应该确保异常不会跨层边界传播。查看未捕获的原始异常对UI有什么好处?

这是一个实现决策,他们不会将原始原因设置为ejbException的原因。您可以通过getCausedByException()方法访问该方法。 关于这一点,您有一个JIRA[1](看看这一点,因为这是一个痛苦的解决方法),您可以将JBoss作为实现[2]来考虑

[1] :


[2] :

您是否使用了log4j之类的日志库?是的,这些代码至少应该是日志记录,但我有一堆代码,如果设置了获取堆栈跟踪的功能,这将有助于确保至少不会出现问题。如果抛出选中的异常,事务不会回滚。EJBException在其构造函数中接受异常,尽管它当然可能使用自己的遗留链接代码而不是JDK1.4中引入的代码,或者以其他方式破坏堆栈跟踪,尽管我希望这是容器的一部分。我同意这里的异常处理是不好的,但我有很多遗留代码,所以我尝试至少挽救获得良好的堆栈跟踪。谢谢。您知道在4.2.x分支中是否已修复此问题吗?我知道问题已经解决了,但我不知道他们在哪里解决了问题,也不知道他们在哪里没有解决问题。我想他们之所以把问题解决是因为他们希望这样做:-/
EJBException ....
   at(.....
   at(.....

caused by: NullPointerException