Grails 是否可以在异常中存储其他对象?
我需要在适当的位置显示从服务接收的一些验证消息,并解决了将消息放入异常的问题:Grails 是否可以在异常中存储其他对象?,grails,groovy,Grails,Groovy,我需要在适当的位置显示从服务接收的一些验证消息,并解决了将消息放入异常的问题: class InvalidInputException extends RuntimeException { def errors InvalidInputException(String s) { super(s) } InvalidInputException(String s, errors) { super(s) this.er
class InvalidInputException extends RuntimeException {
def errors
InvalidInputException(String s) {
super(s)
}
InvalidInputException(String s, errors) {
super(s)
this.errors = errors
}
}
...
catch (InvalidInputException e) {
if (e.errors) {
// set them up to display appropriately
}
// render the view
}
这样,我就可以抛出发送错误的异常:
if (errors) {
throw new InvalidInputException("There were some errors", errors)
}
。。然后在捕获异常后,我在控制器中处理错误:
class InvalidInputException extends RuntimeException {
def errors
InvalidInputException(String s) {
super(s)
}
InvalidInputException(String s, errors) {
super(s)
this.errors = errors
}
}
...
catch (InvalidInputException e) {
if (e.errors) {
// set them up to display appropriately
}
// render the view
}
现在,我在某个地方读到Groovy的异常可能花费太多,所以。。。这太糟糕了吗?
将附加数据放入异常中可能会遇到什么问题
这比处理返回的错误消息要容易得多,代码也要短得多。如果您担心Java中异常的性能,我建议您看看这个 如果不创建异常,另一种可能是使服务返回一个表示此流结果的对象。比如:
class MyServiceResult {
List<String> errorCodes = [] //codes for i18n
void addErrorCode(String errorCode) {
errorCodes << errorCode //add error to list
}
boolean isValid() {
return (!(errorCodes.size() > 0)) //if we have errors then isn't valid.
}
List<String> getErrorCodes() {
return errorCodes.asImmutable()
}
}
但重要的是,它可能比创建异常慢2倍。您可以查看所有详细信息。我看还可以。。。你在哪里读到“Groovy的异常可能花费太多”?还有,你对“太多”的定义是什么?例外成本太高的想法对我来说似乎很奇怪。例外是例外。如果抛出异常(在普通java中也是非常昂贵的)会对性能产生影响,那么要么就是做得非常糟糕(抛出太多异常)或者你做得太好了,你可能负担得起重新设计来解决这个问题。@tim_yates我想OP想说的是loteq说的昂贵。例如,我们讨论了这一点。好吧,我想这没关系,因为该流确实是异常的——输入有错误,通常不应该有错误。如果有,如果没有从服务层抛出
RuntimeException
或Error
,则不会回滚事务抢手货如果您需要更多的控制,您可以使您的服务不是事务性的,并手动启动一个。