Grails/Groovy:自定义交易异常

Grails/Groovy : custom Transactional exceptions

抱歉,我已经更新了这个问题,因为这是一个微不足道的问题,我应该在这里强调实际的问题。

考虑一下,唯一的优势是在日志中,或者为了可追溯性,可能会使用此类自定义异常..

我已经为 grails 整理了这个演示项目:https://github.com/vahidhedayati/test-transactions which was ported over from a Java example found here: https://today.java.net/pub/a/today/2006/08/31/jotm-transactions-in-spring-and-hibernate.html

我仍然需要努力,但目前我正试图找到最好的 approach/practice 因为我认为 groovy 例外的内容没有它应该的那么干净是(比 groovy 看起来 Java 多一点)

example below source code

package com.example.exception

class FlightNotFoundException  extends TravelException {

    public FlightNotFoundException(String message) {
        super(message)
    }

    public FlightNotFoundException(Exception e) {
        super(e.getMessage())
    }

}

这是在 groovy 中执行异常 class 的正确方法吗?

source code

class FlightManagerService {

@Transactional
def reserveFlight(BookingRequest bookingRequest) throws FlightNotFoundException {
...
}

它在这个服务中使用,并且每个服务都会抛出一个自定义异常,正如我所说的,我可以看到唯一的优势是稍后跟踪哪个或什么是异常..但这真的是必要的吗我的意思是一个简单的日志。info/error 将报告哪个服务失败或正在抛出异常..

所以我认为我真的应该把事情搞砸,而不是所有的尝试,但仍然值得清理一下,只是为了找到更好的练习。回想一下 grails trainsaction 视频,我真的应该删除所有的 try catch 并可能将可抛出的服务操作替换为:

new domainClass(name: "something", value: 'another').save()
        throw new RuntimeException("Issue saving domainClass")

感谢任何意见

已更新添加

与约书亚交谈后

@Transactional
 def someThing() { 
    domainInstance.save(failOnError: true, flush: true)
}

不需要所有花哨的工作就足够了..(将在更新 git 项目时做一些实验)

问题是您对非异常情况使用了异常。您正在尝试将它们用于逻辑和业务规则。虽然这很常见,但它通常是非常普遍的异常滥用。

在最好的情况下,您应该努力使代码不使用异常来进行流控制。它们只应在发生异常情况(例如非预期行为)的情况下使用。

但是,就是说,如果您继续,您需要确保不包含堆栈跟踪。 Grails 有巨大的堆栈跟踪,将它们填充到您的异常中将对性能产生巨大影响。您可以通过将以下内容添加到您的自定义例外来避免这样做:

/**
* Don't fill in the stack trace because we want things to be faster.
**/
@Override
public Throwable fillInStackTrace() {
    // do nothing
    return this
}