非捕获异常的原因?

时间:2012-11-24 23:47:44

标签: java exception maven eclipselink

我有一些代码会抛出OptimisticLockException(JPA Exception):

try{
    account.someFunction();
}catch(OptimisticLockException ole){
    logger.log(Level.DEBUG, "OptimisticLockException with ole !");      
}catch(Exception e){
    logger.log(Level.DEBUG, "OptimisticLockException with e !");
}

我总是收到OptimisticLockException with e !。我的服务器日志显示:

Exception [EclipseLink-5006] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.OptimisticLockException
...

我的catch块中的OptimisticLockException类型为org.eclipse.persistence.exceptions.OptimisticLockException,就像在我的服务器日志中一样,但我从来没有陷入这个catch块......

为什么......?

感谢您的想法。

PS:我与Maven和Glassfish合作。开始时,我使用了工件eclipselink v2.4.1,而服务器端是2.3.2(参见日志),所以我将Maven版本更改为2.3.2,但结果相同。

2 个答案:

答案 0 :(得分:1)

显然,我们无法直接捕获OptimisticLockException(在javax.persistence或org.eclipse.persistence.exceptions包中),因为它包含在其他异常中。

我测试了这段代码:

try{
        account.someFunction();
    }catch(OptimisticLockException o1){
        logger.log(Level.DEBUG, "org.eclipse.persistence.exceptions.OptimisticLockException thrown !");         
    }catch(javax.persistence.OptimisticLockException o2){
        logger.log(Level.DEBUG, "javax.persistence.OptimisticLockException thorwn !");          
    }catch(Exception e){            

        int i=1;

        for(Throwable t=(Throwable)e; t!=null; t=t.getCause()){
            if(t instanceof OptimisticLockException)
                logger.log(Level.DEBUG, "org.eclipse.persistence.exceptions.OptimisticLockException thrown by Exception block ! " + i);
            else if(t instanceof javax.persistence.OptimisticLockException)
                logger.log(Level.DEBUG, "javax.persistence.OptimisticLockException thrown by Exception block ! " + i);
            else
                logger.log(Level.DEBUG, t + " " + i);
            i++;
        }

    }

我明白了:

  

2012-11-26 14:58:03,515 FATAL [com.sim.web.LoginBean] javax.ejb.EJBException:Transaction aborted 1

     

2012-11-26 14:58:03,515致命[com.sim.web.LoginBean]   javax.transaction.RollbackException:标记为回滚的事务。   2

     

2012-11-26 14:58:03,515致命[com.sim.web.LoginBean]   异常块抛出的javax.persistence.OptimisticLockException!   3

     

2012-11-26 14:58:03,515致命[com.sim.web.LoginBean]   引发的org.eclipse.persistence.exceptions.OptimisticLockException   异常块! 4

所以首先有一个org.eclipse.persistence.exceptions.OptimisticLockException被包装到javax.persistence.OptimisticLockException中,它被包装到javax.transaction.RollbackException中,它被包装到javax.ejb.EJBException中(我正在使用EJB和JTA)

我无法使用catch block RollbackException异常进行测试,因为Eclipse没有检测到这样的异常可以抛出:Unreachable catch block for RollbackException. This exception is never thrown from the try statement body

这很丑陋,但我认为我被谴责抓住Exception类型的异常并递归测试它是否包含OptimisticLockException类型的异常......

感谢您之前的建议

答案 1 :(得分:0)

尝试将代码更改为以下内容:

try {
    account.someFunction();
}
catch(javax.persistence.OptimisticLockException ole) {
    logger.log(Level.DEBUG, "OptimisticLockException with ole !");      
}
catch(Exception e) {
    logger.log(Level.DEBUG, "OptimisticLockException with e !");
}

看看是否有效。我想你会想要捕获JPA OptimisticLockException,而不是Eclipse实现。

另外,仔细检查您的日志记录配置,确保您的阈值是正确的以及诸如此类,看看您是否能够在DEBUG级别获取其他日志语句(可能在account.someFunction();之前将日志语句放在DEBUG级别。