gpt4 book ai didi

grails - 如何处理 GORM 异常

转载 作者:行者123 更新时间:2023-12-01 10:04:10 26 4
gpt4 key购买 nike

我正在尝试对 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");
}

当我用两个线程访问这个 block 时,它会爆炸,异常会传播到 Grails 的标准异常处理程序。即使报告的异常是 StaleObjectStateException,也不会调用 catch block 。

我注意到如果我让它传播到 Controller 并在那里捕获它,我可以捕获它,但似乎我无法在服务中实现异常处理,这很奇怪。

我错过了什么?

最佳答案

我查到了这个问题,我把它贴出来以防其他人遇到这个问题。出现此问题是因为 try/catch block 位于事务服务中。尽管 grails 报告在 save() 调用期间引发了异常,但实际上它是在整个方法中调用的 AFTER promise 。

看来:

  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) {
...
}

我希望这对其他人有用!

关于grails - 如何处理 GORM 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12451792/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com