如何处理GORM异常

3 grails exception-handling grails-orm

我正在尝试为Hibernate抛出的乐观锁类​​型异常实现异常处理,但我遇到了一个奇怪的问题.看来我无法捕获任何Gorm异常.

例如,我在我的服务中有这个代码:

try {
  User user = User.get(1);
  Thread.sleep(10000);
  user.viewedAt(new Date());
  user.save(flush:true);
} catch (OptimisticLockingException ex) {
  log.error("Optimistic lock exception");
} catch (StaleObjectStateException ex) {
  log.error("Optimistic lock exception");
}
Run Code Online (Sandbox Code Playgroud)

当我用两个线程命中这个块时,它会爆炸并且异常传播到Grails的标准异常处理程序.即使报告的异常是,也永远不会调用catch块StaleObjectStateException.

我注意到我可以捕获异常,如果我让它传播到控制器并在那里捕获它,但似乎我无法在服务中实现奇怪的异常处理.

我错过了什么?

小智 6

我找到了这个的底部,我发布它以防其他任何人遇到这个.出现此问题是因为try/catch块处于事务性服务中.虽然grails报告在save()调用期间抛出了异常,但实际上它是在事务提交整个方法之后调用的.

所以似乎:

  1. flush: true 对交易服务没有影响
  2. 在事务服务中捕获GORM相关的异常是不可能的,至少在没有一些工作的情况下是这样

我终于通过自己手动管理事务来解决这个问题

try {
  User.withNewTransaction {
    User user = User.get(id); // Must reload object
    .. // do stuff
    user.save(flush:true)
  }
} catch (OptimisticLockingException ex) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

我希望这对其他人有用!