EJB规范的引用:
如果bean方法遇到系统异常或错误,它应该 只是将错误从bean方法传播到容器 (即bean方法不必捕获异常)。
但我不明白。这是否意味着我不应该捕获所有类型的异常(即尝试捕获Exception
类)并将其重新抛出为我的应用程序异常?
更清晰的示例:
public void beanMethod throws MyApplicationException {
try {
// do something
} catch (Exception e) {
throw new MyApplicationException(e); // Should I do it like this?
}
}
或者这不是针对EJB开发人员,而是针对EJB参考实现开发人员(容器开发人员):在后一种情况下,容器不能将系统异常传播到我的业务方法,而{{1 block永远不会捕获任何系统异常?
答案 0 :(得分:14)
还有更多类型的例外:
通常您应该捕获业务异常。但是,如果你想在那里处理它,你当然可以把它扔到客户端。默认情况下,如果抛出BusinessException,EJB容器将不会回滚您的事务,但您可以通过以下方式注释Exception来更改此行为:
@ApplicationException(rollback = true)
public class NotEnoughMoneyOnYourAccountException extends Exception {
如果您的程序抛出RuntimeException,它将被发送到以RemoteException包装的客户端,并且您的事务将被回滚。与业务异常相比,它们的排除性较低,因此我们通常不会在EJB端捕获它们。
错误是最不常见的,它们甚至可以关闭JVM,通常我们不会捕获它们,因为通常我们无法在程序中处理它们。
答案 1 :(得分:0)
我不知道你从哪里得到这个提示以及上下文是什么,但它似乎意味着bean方法本身根本不应该处理异常处理,只是扔掉它得到的任何东西。这种行为通常最好通过添加您的方法体可能会抛出的异常来实现,具体取决于环境/随机因素,例如throws
clausule中MyApplicationException
现在的变量输入。
通常不需要正确处理由方法中的代码错误(而不是方法调用)引起的异常,因为它们应该通过测试和调试来解决。