2008-10-24 22 views

回答

7

捕捉唯一的例外可以處理。因此,例如,在使用外部資源時,最佳做法是捕獲您知道可以處理的異常的特定。在文件的情況下,這可以是(IOException,SecurityException等),在數據庫的情況下,異常可以是SqlException或其他。

在任何情況下,不抓例外,你不處理,讓它們流向上層能。或者,如果出於某種原因,你確實發現了異常但不處理它們,只需使用拋出;(這將創建一個rethrow IL op,而不是trow)。

如果使用的資源不知道哪種類型的異常可能拋出,那麼您有必要捕獲一般的異常類型。在這種情況下,保險櫃的事情將是使用來自不同應用程序域的所述資源(如果可能的話),或者讓異常冒泡到頂層(例如UI),在那裏它們可以被顯示或記錄。

0

我認爲絕對答案是完全有條件的(如何控制環境,性能和一致性之間的預期平衡以及其他許多其他我確信),但總體而言,我總是這樣做,選擇安全超過潛在的較慢性能。

0

它總是取決於你想達到的目標。沒有響應的服務器可能會嚴重到足以阻止例程執行什麼操作,並且異常應該拋出給調用者。

在其他情況下,你不關心你是否無法更新數據庫。然後消耗例外是好的。

顯然,您不想向最終用戶顯示堆棧跟蹤,所以您需要在某處捕獲它。

2

Eric Lippert在此有一個很好的博客,here

除非你能做一些有用的事情,否則沒有意義(除了「煩人的」(見博客))捕捉異常。而且在大多數情況下,你根本無法 - 所以讓它冒泡(你的UI顯然應該清理並顯示一些東西)。

但是,您可能有一個「嘗試/最終」來處理資源管理。甚至更乾淨,「使用」塊做同樣的事情。

3

我認爲有三個方面的原因有一個catch塊:

  • 您可以處理異常和恢復(從「低水平」的代碼)
  • 你想重新包裝異常(再次,從「低水平」的代碼)
  • 你在堆棧的頂部,而你不能恢復操作本身,你不希望整個應用程序如果你堅持下去

對於這些,你應該有非常fe w catch塊與try/finally塊相比 - 而那些try/finally塊幾乎總是隻叫Dispose,因此最好寫成using聲明。

底線:有一個finally塊來釋放資源是非常重要的,但catch塊應該通常很少見。