2011-01-07 113 views
7

,你會從一個只讀屬性,拋出什麼類型0的異常時正在使用的返回值的對象爲null什麼異常的類型拋出

public class TestClass 
{ 
    SomeObject obj; 
    public string NameOfObject 
    { 
     get 
     { 
      if(obj == null) 
      { // what exception type to throw here } 
      return obj.Name; 
     } 
} 
+2

也許這是它的主題的問題,但爲什麼要扔一個呢? – 4imble 2011-01-07 15:44:47

+0

重要提示:屬性在讀取時應該(幾乎)不會拋出異常。 (InvalidOperation是你可以使用的)。 http://msdn.microsoft.com/en-us/library/bb386039.aspx – FastAl 2014-01-15 13:42:39

回答

7

我在這種情況下會使用InvalidOperationException,因爲對該對象的當前狀態訪問屬性無效。

根據MSDN文檔:
「當方法調用對於對象的當前狀態無效時引發的異常。」
另請參見:
「InvalidOperationException用於調用方法失敗的原因不是由無效參數引起的情況。」

在這種情況下obj不爭論,這就是爲什麼我會走向「InvalidOperationException異常」

爲什麼我不會在這裏拋出NullReferenceException異常的原因:如果你沒有添加任何特殊代碼,多數民衆贊成在「.Net」會拋出異常,爲什麼要添加冗餘代碼?

2

除非你說的地方,這個屬性永遠爲空,爲什麼你需要拋出異常?

話雖如此,如果你有保證,我會拋出一個InvalidOperationException

InvalidOperationException

當 方法調用對於 對象的當前狀態無效時引發的異常。

9

我會拋出一個InvalidOperationException

ArgumentNullException我只在方法參數爲空時拋出。

如果方法參數處於無效狀態,我會拋出一個ArgumentException

+3

如果您執行`新的InvalidOperationException()`而不傳遞您自己的消息,默認消息是「操作無效由於當前狀態對象「,這是完全正確的。 – 2011-01-07 15:36:48

+0

+1爲詳細信息;) – Khh 2011-01-07 16:34:35

4

你不應該拋出NullReferenceException。它被保留用於空對象被解除引用的情況。在這種情況下,如果您要拋出NullReference,那麼您可能只需將null檢出並讓框架在嘗試訪問obj的Name時將其拋出。我想扔InvalidOperationException而不是。

1

我會拋出一個InvalidOperationException,但前提是: - 它是合法的objnull,它是用戶的責任來檢查這一點,或 - 這是不合法的objnull在首位(即obj != null是一類不變)

如果沒有上面的話(也就是,它是合法的objnull和用戶代碼沒有明確要求使用前檢查此該物業),那麼我不會拋棄,而是返回null

1

我會重新審視這個設計,以使這個狀態不能在第一個位置存在,即obj爲null。一般來說,從API的角度來看,您應該能夠真誠地調用一個吸氣劑,使其不會因物體處於未知狀態而爆炸。

例如,爲什麼不將'SomeObject obj'作爲構造函數參數並在構造點使用參數驗證。這將確保'obj'的狀態總是正確的,即在施工後非空。

有許多模式可用於確保對象在用戶可用時具有正確的狀態。

2

每個人都覆蓋了明顯的,所以這裏有另一種選擇。

如果您的課程必須以某種方式進行初始化(您的SomeObject必須在某個時間點設置),請考慮實施ISupportInitialize。這表明您的班級的用戶在調用EndInit()之前未處於有效狀態。不幸的是,沒有預先存在的一般NotInitializedException你可以使用(有一些但特定於某些命名空間),所以我建議配對你的接口的實現和創建這樣一個例外。

用戶必須先撥打BeginInit(),然後配置實例,然後撥打EndInit()。在致電EndInit()時,請檢查您的實例的狀態。如果它沒有被正確初始化,你可以拋出一個InvalidOperationException異常。如果用戶在初始化之前嘗試使用您的實例,則會拋出NotInitializedException。

它更多的工作,但好處是,你正在爲你的用戶提供更廣泛的「成功的坑」,確保他們正確地使用你的類由於未能快速和早期,和你的類型的定義本身(界面非常清晰,你期望的)。它也給你更多的「空間」,可以這麼說,記錄你的班級應該如何使用。

1

看着你提供的代碼,不知道你的設計假設的任何事情,我會說你根本不應該測試obj == null,並讓框架拋出一個NullReferenceException。那麼爲什麼你想要這個測試?我能想到的一個原因是,您希望有一個更有意義的調試錯誤消息,但是您應該使用Debug.Assert(obj != null, "Your message here")

相關問題