3

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

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 的异常可能会花费太多,所以......这太糟糕了吗?将其他数据放入异常中可能会遇到什么问题?

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

4

1 回答 1

2

如果您担心 Java 中异常的性能,我建议您查看 this 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 倍您可以在这篇文章中查看所有详细信息。

于 2013-07-12T15:47:36.593 回答