以下代码:
try {
value = parse(myData);
} catch (Exception e) {
if ( e instanceof IOException|| e instanceof IllegalArgumentException) {
logger.debug("illegal argument");
} else {
logger.debug("this is printing");
}
}
解析方法:
parse(String data) throws IOException, IllegalArgumentException {
// do validation
throw new IllegalArgumentException("illegal");
}
我期待着“非法争论”。但它却显示“这是打印”。
我错过了什么吗?
我追踪到了。当抛出此 IllegalArgumentException 时,它会被 EJBTransactionRollbackException 包装。
抛出以下内容:
The transaction has been marked rollback only because the bean encountered a non-application
exception :java.lang.IllegalArgumentException:
Actual Exception class: class javax.ejb.EJBTransactionRolledbackException
现在问题不同了,如何不让 EJBTransactionException 覆盖实际的异常
只是一个想法。您确定在 throw 和 catch 部分使用同一包中的类吗?例如,您可以在解析方法中抛出
com.foo.bar.IllegalArgumentException
但尝试捕获 java.lang.IllegalArgumentException
那么,请检查导入部分,以防它们位于不同的类别中。
是的,你是对的。 IllegalArgumentException 由 EJBTransactionRollbackException 包装。当我在 EJB Bean 中使用 JsrValidator 时,我遇到了同样的问题。发生这种情况是因为 EJB Bean 内部抛出了 RuntimeException,并且 AOP 包装了它。如果您也在 parse 方法中使用 EJB bean,请尝试在那里添加 try-catch。