2011-03-11 53 views
3

我使用asp.net 4,c#和ef4。在C#中使用實體框架異常處理4

我想知道什麼是捕獲實體框架中的泛型異常的最佳方法。

  • 目前我用Exception它是合適的嗎?
  • 如何捕獲更具體的?

謝謝你的時間。

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

回答

7

捕獲泛型異常並取消它們很少有用。例外情況可以幫助您確保代碼可以正確執行。

你可以這樣趕上就像你有通用(雖然與標識符你已經錯過了你的例子)具體的異常類型:

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

在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 
} 
+2

恕我直言'InvalidOperationException'是一個不好的例子,因爲它幾乎永遠不能被處理。 (幾乎可以被誤用) – jgauffin 2011-03-11 10:12:39

+0

@jgauffin:這只是一個更具體的例外情況,並不是指令。爲什麼不建議更好的?隨意編輯答案放置它。 – Lazarus 2011-03-11 10:19:20

+0

完成。 :)正確處理'OptimisticConcurrencyException'有點容易 – jgauffin 2011-03-11 10:31:03

2

你在你的例子正趕上方式是不好的,總是記錄異常的地方,並以某種方式,例如在一個文本文件或一個SMTPAppender,您可以使用log4net的,並得到它在很短的時間內運行與最小編碼從你身邊。

這樣說,它的確取決於您是否想要以不同的方式處理不同的異常,例如,如果找不到文件,您可以決定創建它或告訴用戶執行某些操作,如果拋出更一般的異常可能會採取不同的行動...

只是要記住,你應該把所有的catch子句從更具體到更通用的一個,在你的例子中,如果你有多個catch,你寫的應該放在結束。

5

不要這樣做。

您在隱藏可能嚴重影響應用程序可靠性的錯誤。 由於某種原因引發的例外,只是繼續就像沒有發生任何事情是錯誤的。

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

,才應使用捕捉所有

一)想時,在包層邊界異常(但確實包含原始異常)。 b)當異常傳播到頂層時(如果異常未被捕獲,它將終止你的應用程序)。

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