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 多一点)
package com.example.exception
class FlightNotFoundException extends TravelException {
public FlightNotFoundException(String message) {
super(message)
}
public FlightNotFoundException(Exception e) {
super(e.getMessage())
}
}
这是在 groovy 中执行异常 class 的正确方法吗?
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
}
抱歉,我已经更新了这个问题,因为这是一个微不足道的问题,我应该在这里强调实际的问题。
考虑一下,唯一的优势是在日志中,或者为了可追溯性,可能会使用此类自定义异常..
我已经为 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 多一点)
package com.example.exception
class FlightNotFoundException extends TravelException {
public FlightNotFoundException(String message) {
super(message)
}
public FlightNotFoundException(Exception e) {
super(e.getMessage())
}
}
这是在 groovy 中执行异常 class 的正确方法吗?
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
}