我有一些代码会抛出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,但结果相同。
答案 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级别。