Java EJB3.0异常处理
引用EJB规范: 如果bean方法遇到系统异常或错误,它应该 只需将错误从bean方法传播到容器 (即,bean方法不必捕获异常) 但我不明白。这是否意味着我不应该捕获所有类型的异常(即尝试捕获Java EJB3.0异常处理,java,jakarta-ee,exception,ejb,ejb-3.0,Java,Jakarta Ee,Exception,Ejb,Ejb 3.0,引用EJB规范: 如果bean方法遇到系统异常或错误,它应该 只需将错误从bean方法传播到容器 (即,bean方法不必捕获异常) 但我不明白。这是否意味着我不应该捕获所有类型的异常(即尝试捕获Exceptionclass)并将其作为我的应用程序异常重新提交 更清晰的示例如下: public void beanMethod throws MyApplicationException { try { // do something } catch (Exception e) {
Exception
class)并将其作为我的应用程序异常重新提交
更清晰的示例如下:
public void beanMethod throws MyApplicationException {
try {
// do something
} catch (Exception e) {
throw new MyApplicationException(e); // Should I do it like this?
}
}
或者这不是针对EJB开发人员,而是仅针对EJB引用实现开发人员(容器开发人员):在后一种情况下,因此,容器不得将系统异常传播到我的业务方法和我的
catch(异常e)
block永远不会捕获任何系统异常?我不知道这个技巧是从哪里得到的,也不知道上下文是什么,但这似乎意味着bean方法本身不应该做任何异常处理,只需抛出它得到的任何东西。通常,通过添加方法主体可能抛出的异常(取决于环境/随机因素,如throws
子句中的变量输入)可以最好地实现该行为,其中MyApplicationException
现在是
通常不需要正确处理由方法(而不是方法调用)中的代码错误直接导致的异常,因为这些异常应该通过测试和调试排除。有更多类型的异常:
- 系统异常(运行时异常,例如NullPointerException)
- 业务异常(您自己的异常、扩展异常,但不是运行时异常,例如NotEnoughMoneyOnYourAccountException)
- 错误(例如OutOfMemoryError)
@ApplicationException(rollback = true)
public class NotEnoughMoneyOnYourAccountException extends Exception {
如果您的程序抛出RuntimeException,它将被包装为RemoteException发送到客户端,并且您的事务将回滚。与业务异常相比,这些异常较少被排除,因此我们通常不会在EJB端捕获它们
错误是最不例外的,它们甚至可以关闭JVM,通常我们无法捕获它们,因为通常我们无法在程序中处理它们。也就是说,您建议我在ejb方法中不要使用try-catch块?如果您想将非运行时异常包装到自己的程序中,也许可以。例如SQLException-->MyBusinessException.ok,谢谢。如果我的EJB使用DAO层,并且DAO层可以抛出RuntimeException呢?我是否可以在Ejb业务方法中捕获特定于DAO的异常,并将其作为
MyBusinessException
重新发送?若我并没有捕捉到它,那个么容器将假定我的DaoException是一个系统异常,并因此销毁ejb实例(当系统异常发生时ejb实例被销毁)。但我不想因为SQLCodeYes中的一些错误而丢失ejb实例。例如:}catch(SQLException e){throw new NotEnoughMoneyOnYourAccountException(e.getMessage(),e.getCause());