簡體   English   中英

使用實體框架4在C#中進行異常處理

[英]Exception Handling in C# with Entity Framwork 4

我使用asp.net 4,c#和ef4。

我想知道從實體框架中捕獲通用異常的最佳方法是什么

  • 目前我使用Exception它是否合適?
  • 如何抓住更具體的一個?

謝謝你的時間。

try
{
    context.DeleteObject(myLockedContent);
    context.SaveChanges();
}
catch (Exception)
{
    e.Cancel = true;
}

捕獲通用異常並取消它們很少有好處。 有例外可以幫助您確保代碼可以正常運行。

您可以捕獲特定的異常類型,就像您對泛型一樣(盡管您的示例中已經錯過了標識符),因此:

catch (OptimisticConcurrencyException ex) 
{
    // Do some real work to resolve the exception
}

catch語句中指定的異常類型告訴運行時捕獲特定的和任何子異常 因此,您需要將catch語句從最特定的異常組織到最少,即:

catch (OptimisticConcurrencyException ex) 
{
    // Do some real work to resolve the specific exception
}
...
catch (Exception ex) 
{
    // Do some real work to resolve the generic 'catch-all' exception
}

不要那樣做。

您隱藏了可能嚴重影響應用程序可靠性的錯誤。 拋出異常是有原因的 ,只是繼續,就像沒有發生任何事情一樣是錯誤的。

你的方法無法按照承諾返回結果,這將影響使用它的所有代碼。 但調用方法不會知道異常,並且在最壞的情況下會繼續,因為沒有發生任何事情,因此會產生不希望的結果。

你應該只使用catch all

a)何時想要在層邊界處包裝異常(但包括原始異常)。

b)當異常傳播到頂層時(如果未捕獲異常,將終止您的應用程序)。

除此之外,只有在您可以處理它們時才捕獲異常 這意味着通過捕獲異常,您可以返回調用者期望的結果。

您在示例中捕獲的方式很糟糕,總是在某處以某種方式記錄異常,例如在文本文件或SMTPAppender上,您可以使用Log4Net並在很短的時間內以最少的編碼來運行它。

這樣說,這實際上取決於你是否想要以不同的方式處理不同的異常,例如,如果找不到文件你可以決定創建它或告訴用戶做某事,如果拋出更一般的異常你可能采取不同的行為。 ..

請記住,您應該將所有catch子句從更具體的catch子句放到更通用的子句中,在您的示例中,如果您有多個catch,那么您編寫的那個應該放在最后。

暫無
暫無

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

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