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
,则不会回滚事务抢手货如果您需要更多的控制,您可以使您的服务不是事务性的,并手动启动一个。