【问题标题】:Reasons for non catched Exception?未捕获异常的原因?
【发布时间】:2012-11-12 20:48:37
【问题描述】:

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

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 块中的 OptimisticLockExceptionorg.eclipse.persistence.exceptions.OptimisticLockException 类型,就像我的服务器日志中一样,但我从来没有陷入这个 catch 块...

为什么...?

感谢您的想法。

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

【问题讨论】:

  • 尝试捕获 jpa 异常,我认为 eclipselink 中的一些代码正在捕获 org.eclipse.persistence 异常并将其重新抛出为新 javax.persistence 异常的“原因”。
  • 在我的情况下,JPA OptimisticLockException 也被包裹在 RollbackException 中,而 RollbackException 最终被包裹在 EJBException 中
  • 您将 JPA 代码包装在需要抛出自己的异常的包装器中。很可能是因为在方法结束时发生了事务处理。您可以尝试调用 em.flush,它应该允许在您的 ejb 中处理乐观锁。
  • 很好,我在论坛上看到了这个,但我忘记了。感谢 em.flush() 我的代码更有条理,但对性能有什么影响吗?泰

标签: java exception maven eclipselink


【解决方案1】:

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

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 级别。

【讨论】:

  • EclipseLink OptimisticLockException 将被包裹在 JPA OptimisticLockException 中
【解决方案2】:

显然,我们无法直接捕获 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 致命 [com.sim.web.LoginBean] javax.ejb.EJBException:事务中止 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 块 RollbackException 异常进行测试,因为 Eclipse 没有检测到可以抛出此类异常:Unreachable catch block for RollbackException. This exception is never thrown from the try statement body

这很丑,但我认为我注定要捕获 Exception 类型的异常并递归测试它是否包含 OptimisticLockException 类型的异常...

感谢您之前的建议

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 2010-09-28
相关资源
最近更新 更多