2011-07-18 94 views
1

以下例外情況可能是非常相似:我應該處理/處理這些異常嗎?

  • ArgumentException
  • ArgumentNullException
  • InvalidOperationException
  • ObjectDisposedException

    1. 我應該扔在我的代碼?
    2. 我應該追上他們?
    3. InvalidOperationException是一個非常模糊的和廣泛的例外,因爲它意味着一個方法試圖東西是不可能的,由於狀態(例如啓動一個雙贏SVC這可能不是啓動的)。
+0

是否有可能您的代碼會拋出這些異常?如果是的話就抓住他們。一些代碼會很有用 – skyfoot

+0

除非你期待他們,並且你知道*特別是*如何處理他們,否則不要捕捉任何異常。如果不是,不要抓住它們。讓他們泡上堆棧。這是他們設計的目的。並且沒有什麼時候你應該捕獲ObjectDisposedException。這表明您的程序中存在一個錯誤;你想解決這個問題,而不是抓住它。 –

回答

1

這一切都取決於你在做什麼。除了ObjectDisposedException,這是你應該留給運行時間的東西,所有這些都可以接受,以適當的情況。

你希望其中的一些通過各種手段再發生,抓住他們,並適當地處理這種情況。

2

作爲一般規則,你應該拋出的最具體的異常就可以了。這爲消費者提供了處理/理解異常的最佳機會。

因此,例如,

  • 擲ArgumnetNullException,當arg是空擲
  • ArgumentOutofRange異常時arg是超出範圍的
  • ArgumentException的是arg是某些其他原因無效。

InvalidOperationException是相當寬泛的,並且在更多特定選項不適合時經常用作catchall。

1

大部分的自制方法的參數驗證(通常命名爲喜歡的後衛,參數,等等)都在參數無效的情況下拋出這些異常:

  • 的ArgumentException - 當方法參數錯誤
  • ArgumentNullException - 當方法參數爲null

我相信MSDN有何時拋出這樣的例外非常詳細的描述,

ArgumentException在調用方法時被拋出,並且至少有一個 傳遞的參數不符合被調用方法的參數說明 。的ArgumentException的所有實例應進行描述無效參數一個 有意義的錯誤消息,以及用於 參數值的預期範圍。

ArgumentNullException當一個方法被調用並且至少有一個 傳遞參數爲空,但不應該爲空。

InvalidOperationException異常在的情況下使用時的失敗調用 一個方法是由比無效的參數等原因引起的。對於 例如,InvalidOperationException異常是通過拋出:

  • 的MoveNext如果一個集合中的對象創建 枚舉之後被修改。
  • GetString如果在方法調用之前關閉資源集是 。