[英]throw exception in the try block rather than catch block?
我已經在我們的項目中繼承了如下代碼。 這是一個類中的方法。
protected override bool Load()
{
DataAccess.SomeEntity record;
try
{
record = _repository.Get(t => t.ID.Equals(ID));
if (record == null)
{
throw new InvalidOperationException("failed to initialize the object.");
}
else
{
this.ID = record.ID;
// this.OtherProperty = record.SomeProperty;
// etc
}
}
catch (Exception)
{
throw;
}
return true;
}
如果然后從我的UI層調用此Load方法,則可能想要一個try catch塊來捕獲由於無法加載實例而導致的任何異常,例如InvalidOperationException,但是上述代碼對我來說是錯誤的。
catch語句不會吞並InvalidOperationException嗎? 該catch語句還將捕獲_repository.Get的潛在問題,以及在記錄有效時屬性設置的潛在問題。
我以為我可能應該通過添加更多的try catch語句來分別處理Get操作和屬性設置操作來重組它,或者添加更多的catch塊來處理不同的異常,但是我問了一位同事,他建議try catch與這無關的情況下,應將其完全移除,就像這樣:
protected override bool Load()
{
DataAccess.SomeEntity record;
record = _repository.Get(t => t.ID.Equals(ID));
if (record == null)
{
throw new InvalidOperationException("failed to initialize the object.");
}
else
{
this.ID = record.ID;
// this.OtherProperty = record.SomeProperty;
// etc
}
return true;
}
我想要第二點意見,我只是剛開始對異常處理感興趣,所以我想確保根據最佳實踐以正確的方式來做。
執行此操作時:
catch (Exception)
{
throw;
}
您基本上不處理異常。 但是,這並不意味着您會忽略它。 throw
語句將異常傳播到堆棧中。 為了使代碼清晰易讀,您的最終示例要好得多。
如果在調用方法(Ithink)中捕獲異常,則應僅捕獲您期望的異常 。 如果該異常是Load()的問題,請向調用方法拋出新的異常,並提供有關該異常的更多信息。
優秀! 您絕對是在正確的軌道上。 先前的實現只是重新拋出不必要的異常而已。 您應該只處理業務層中預期的特定異常,否則讓它們自然地將調用堆棧上移至UI層。
最佳做法是,僅在要添加一些其他調試信息時才重新拋出異常,在這種情況下,您將需要定義一個自定義異常
異常將由 catch
語句捕獲,但是由於它具有throw
語句,因此它將拋出該異常。 這與根本沒有嘗試/捕獲功能具有相同的效果,因此您的同事建議不要使用它,這是正確的。
如果您實際上不以任何方式處理異常,則添加異常處理代碼沒有多大意義。
我同意您的同事的看法,您只應捕獲已知需要捕獲的異常。 我通常會忽略任何嘗試捕獲塊,除非我確切知道為什么在特定情況下需要它。 這是因為,如果僅在所有內容周圍放置try catch塊,則傾向於隱藏代碼中的實際錯誤。 保留錯誤處理,直到您完全需要它為止-從應用程序最高點的單個全局錯誤處理程序開始-如果這是asp.net,則可以掛鈎應用程序錯誤事件並在那里記錄錯誤,但是我的意思是don除非您知道為什么添加它們並編寫處理錯誤情況的代碼不會捕獲它們,否則不要添加try catch塊。
請享用!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.