簡體   English   中英

如何解開Guice ProvisionException?

[英]How can I unwrap Guice ProvisionException?

如果在Guice創建類時拋出異常,則ProvisionException包裝原始異常。

有沒有辦法強制拋出原始異常呢?

例如:

@Inject
public myClass() {

  throw new MySpecificException();
}

我知道,我可以捕獲ProvisionException並調用getCause()進行解包並轉到MySpecificException 但是,如果可能的話,我寧願替代默認的Guice異常。

不,你不能。

ProvisionException除了包裝一個Exception外,還可以做很多其他事情。 Guice設置為可立即捕獲許多異常,將它們匯總為一個異常,然后向您發送方便,有用的消息,以找出問題所在。

例如,在Guice源代碼中,有很多這樣的代碼

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 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM