2015-08-27 66 views
1

在情況和異常,而吉斯是創建一個類 ProvisionException包裹原來的異常被拋出。如何解開Guice ProvisionException?

有沒有辦法迫使原始異常而不是拋出?

例如:

@Inject 
public myClass() { 

    throw new MySpecificException(); 
} 

我知道,我能趕上ProvisionException,並呼籲getCause()解開,並獲得了MySpecificException。但是,如果可能的話,我寧願重寫默認的Guice異常。

回答

2

不,你不能。

ProvisionException確實比包裹一個異常多很多; Guice設置爲立即捕獲許多異常,將它們一起放入一個Exception中,然後發送方便有用的消息給您,以便找出錯誤。

例如,在吉斯源代碼中有很多code like this

try { 
    result = callable.call(); 
    // Make sure we don't return the provisioned object if there were any errors 
    // injecting its field/method dependencies. 
    errors.throwIfNewErrors(numErrorsBefore); 
} catch(ErrorsException ee) { 
    exceptionDuringProvision = ee; 
    throw new ProvisionException(errors.merge(ee.getErrors()).getMessages()) 
} 

錯誤處理系統是如此深入地集成,你不會是能夠提取出來;老實說,你爲什麼想要?這樣做的關鍵就是讓你很容易找出問題。如果你得到ProvisionException,這意味着你的代碼做錯了事情,需要更改; ;這不是您可以從中恢復並返回正常操作的那種事情。

在我的生產體系​​,我趕在不同的地方很多例外,進行處理,記錄它們並嘗試恢復。但是,ProvisionException不是其中之一;如果我的系統拋出它,我想讓整個織物崩潰,所以我可以立即找出它並修復它。 (當然,在我部署一個新版本的時候,它已經過了全面的測試,所以我知道,至少在出現問題時它不會是ProvisionException)。

+0

構造函數可以拋出由於瞬態錯誤錯誤,應該能夠在這些情況下恢復,而不需要重新啓動整個應用程序。 Guice的設計在這個問題上真的很自以爲是,這使得它更難使用。 –