可以在Exception中存储其他对象吗?

时间:2013-07-12 12:26:56

标签: grails groovy

我需要在适当的位置显示从服务中收到的一些验证消息,我解决了它将消息放在异常中:

class InvalidInputException extends RuntimeException {
    def errors
    InvalidInputException(String s) {
        super(s)
    }

    InvalidInputException(String s, errors) {
        super(s)
        this.errors = errors
    }
}

这样,我可以抛出发送错误的异常:

if (errors) {
    throw new InvalidInputException("There were some errors", errors)
}

..然后我在捕获异常之后在控制器中处理错误:

...
catch (InvalidInputException e) {
    if (e.errors) {
        // set them up to display appropriately
    }
    // render the view
}

现在,我已经在某处看到Groovy的例外情况会花费太多,所以......这太糟糕了吗? 在异常中添加其他数据可能会遇到什么问题?

这比摆弄返回的错误消息容易得多,而且代码要短得多。

1 个答案:

答案 0 :(得分:2)

如果您担心Java中的异常性能,建议您查看other question

如果不创建异常,另一种可能性是使服务返回一个表示此流结果的对象。类似的东西:

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()
  } 

}

只需在您的服务方法中使用它

class MyService {
  MyServiceResult someMethod() {
    MyServiceResult result = new MyServiceResult()
    ...
    result.addErrorCode('some.key.here')
    ...
    return result
  }
}

class MyController {
  def myService
  def action() {
    MyServiceResult result = myService.someMethod()
    if(!result.isValid()) {
      //handle errors
    }
  }
}

但重要的是要说它比创建例外要慢2倍。您可以查看this post中的所有详细信息。

相关问题