2013-07-12 87 views
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

看起來對我來說......您在哪裏閱讀過_「Groovy的例外可能花費太多」_?另外,你對「太多」的定義是什麼? –

+3

一個例外花費太多的想法對我來說似乎很奇怪。例外是例外。如果你處於拋出異常(它們是昂貴的,也是普通的java)對你的性能有影響的地步,要麼你真的做得非常糟糕(拋出太多例外),要麼你做得很好,你可能負擔得起重新設計以解決問題。 – loteq

+0

@tim_yates我認爲OP想要說出loteq對昂貴的說法。例如,這裏討論[這裏](http://stackoverflow.com/questions/299068/how-slow-are-java-exceptions)。 –

回答

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中的所有詳細信息。

+1

如果有任何事務,如果不從服務層拋出'RuntimeException'或'Error',則不會回滾事務。 :) – dmahapatro

+0

好抓!如果你需要更多的控制,你可以讓你的服務不是事務性的,而是手動啓動。 –

相關問題