2010-06-21 70 views
6

在.NET中,當捕獲異常時,我應該總是捕獲派生異常(所以不是ArgumentException,而是派生類型)?捕獲大多數派生異常?

另外:

如果有人問我使用錯誤代碼,這會不會在構造函數中,像這樣?:

拋出新的異常(「4000」,前);

或者是一個具有errorcode屬性的自定義異常類型? (這可能會引起異常類型的混淆,例如SqlException,其中的錯誤代碼映射到SQL Server錯誤)。

感謝

+0

從哪裏來的錯誤代碼?這些錯誤代碼是否爲原生Win32錯誤代碼? – 2010-06-21 16:53:24

回答

6
  1. 抓住最廣泛的例外,你知道如何處理。

    一般來說,這意味着你會捕捉一個非常特殊的異常。有些例外,如ArgumentException,不應該在所有的b/c中被捕獲,它們表示邏輯錯誤而不是運行時錯誤。在文件I/O的情況下,我發現捕捉更廣泛的異常有用的地方是有用的。一個IOException可能是一個實際的更高級別的例外。

  2. 如果您被要求使用錯誤代碼,您可以避免使用異常的消息屬性來包裝它,但我絕不會使用它作爲避免引發適當類型異常的原因。這是因爲這裏有兩個單獨的問題:

    a。錯誤代碼用於提供特定的信息,可以在現場發生故障時查找。它不應該用於以編程方式區分異常類型。b/c語言具有專門爲此設計的特定工具:異常類型。

    b。適當類型的例外是提供區分例外的程序化方式。該語言是爲它設計的,使用它。不要有史以來扔一個普通的Exception

    我可能會在Exception.Data collection中輸入錯誤代碼。這樣可以避免覆蓋Exception.Message中的消息,否則這些消息對診斷目的非常有用。

+0

我不確定關於ArgumentException與其他許多類型差不多的「嚴重性」有很多基礎。捕捉異常時真正需要知道的是系統的狀態(以及拋出異常的例程是否影響它)。如果嘗試例如解析一個文件,我不確定在調用例程之前驗證所有字段是非常有價值的,如果它們的參數無效,那麼拋出ArgumentException,除非我自己的代碼在給出無效輸入的情況下可以做比拋出異常更有用的東西。所以我幾乎看不到它意味着「邏輯錯誤」。 – supercat 2011-02-04 21:30:41

2

如果你想趕上一個確切的異常或一組不同類型的異常的這取決於。

有時您只想爲1個確切的異常添加處理。其他時候,你的異常處理對於任何類型的異常都是一樣的,所以你可以把catch或者只是捕獲Exception來查看異常是什麼。

例如,您可能只想捕獲1個確切的異常並且沒有其他異常處理。當你知道進一步調用堆棧的時候,你會這樣做,你正在捕獲其餘的異常,但是你只想忽略你正在捕獲的異常。