IllegalArgumentException 没有被捕获或丢失某些东西

问题描述 投票:0回答:3

以下代码:

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");
}

我期待着“非法争论”。但它却显示“这是打印”。

我错过了什么吗?

java exception try-catch illegalargumentexception throws
3个回答
2
投票

我追踪到了。当抛出此 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 覆盖实际的异常


0
投票

只是一个想法。您确定在 throwcatch 部分使用同一包中的类吗?例如,您可以在解析方法中抛出

com.foo.bar.IllegalArgumentException
但尝试捕获
java.lang.IllegalArgumentException
那么,请检查导入部分,以防它们位于不同的类别中。


0
投票

是的,你是对的。 IllegalArgumentException 由 EJBTransactionRollbackException 包装。当我在 EJB Bean 中使用 JsrValidator 时,我遇到了同样的问题。发生这种情况是因为 EJB Bean 内部抛出了 RuntimeException,并且 AOP 包装了它。如果您也在 parse 方法中使用 EJB bean,请尝试在那里添加 try-catch。

© www.soinside.com 2019 - 2024. All rights reserved.