2012-10-12 45 views
39

如果我有一個方法來檢查它的參數的有效性,拋出我自己的自定義異常派生自System.ArgumentException是否可以?我在問,因爲ArgumentException本身是從System.SystemException派生而來的,我看到有衝突的指導原則,應用程序是否應該從SystemException派生。 (儘管是間接的,從ArgumentException推導仍然無異於從SystemException獲得。)可以從System.ArgumentException派生嗎?

我看到很多的指導方針說,不從ApplicationException獲得,而是從異常派生來代替。我對此感到高興。我不確定是否可以從SystemException派生。

如果我不應該從SystemException派生出來,那麼我應該從哪個派生我的"invalid argument"異常類?

+2

如果提供的參數無效,該方法預計會拋出'ArgumentException'。你可以完全從它中派生出來用於這種情況。從「SystemException」派生出來沒有意義,但如果參數爲null,則拋出'ArgumentNullException',如果它超出可接受的範圍則拋出'ArgumentOutOfRangeException'。它們都來自'ArgumentException'。所以在這種情況下拋出一個不是從'ArgumentException'派生的自定義異常是恕我直言,你不應該做的事情。所以我會用Botz3000的答案。 –

回答

5

如果你想派生「無效的參數」的例外,他們沒有超出一個意思,然後ArgumentException聽起來像一個合理的候選人:

的ArgumentException當調用方法時拋出並且至少有一個傳入的參數不符合被調用方法的參數說明。 --MSDN

2

如果您100%重複使用ArgumentException屬性並添加了一些額外的功能,那就沒問題。但是,如果您只是因爲名稱而重複使用它,那就不行了。

7

從System.ArgumentException派生的一個好處是,catch(System.ArgumentException)塊將能夠處理您的自定義異常類型以及System.ArgumentException。這可能是也可能不是你想要的。

4

在.NET異常背後的最初的想法是,在基類庫例外(如系統組件)拋出從System.Exception導出並注意,所有的自定義異常從System.ApplicationException繼承BCL異常和應用程序異常區分例外但是微軟已經迴避了這個想法,現在建議所有例外都從System.Exception繼承。

我的建議是從框架中最低的Exception類繼承,這是合理的。

如果您的異常意味着某個特定的事情,而不是此參數有問題,例如該類型可以將語義添加到異常(就像ArgumentNullExceptionArgumentOutOfRangeException一樣),然後創建一個自定義的,如果不是,則只需使用ArgumentException並提供一個有意義的異常消息。

+0

用戶異常應該來自ApplicationException,而不是SystemException。 –

+0

那麼斑點,我在那篇文章中經常輸入異常,我會糾正它! –

相關問題