2011-03-17 43 views
1

我在和Pex和Moles玩耍,Pex發現幾乎所有的Pex表示失敗的測試都是因爲NullReferenceExceptions是「允許的」。讀取的Pex文檔,我橫跨以下就來了:是否允許NullReferenceExceptions發生壞事的可能性?

如果更高級別的分量通過 畸形數據到較低級別的 組件,其中較低級的 組件拒絕,則 更高級別的組件應該是 在第一個 的地方阻止這樣做。

那麼上面的建議是,我們應該測試等方法/班前空值使用類似叫做:空值遍不上訴的,那麼多的

if(foo == null) 
    throw new ArgumentNullException("its null and this shouldn't happen") 
else 
    Bar(foo); //won't get a null reference exception here because we checked first... 

恕我直言檢查性能和代碼膨脹的原因,但我想聽聽其他人有什麼要說......

回答

9

是的,你應該在使用它們之前驗證你的論點,國際海事組織。

NullReferenceException應該發生意外的空值被使用。它永遠不應該被明確地拋出,並且在最終拋出它的方法或者它被調用的方法的層面上指出問題。

ArgumentNullException表示方法之前的在調用堆棧中的缺陷比拋出它的方法。 (通常,但並非總是直接呼叫者)

您越早發現異常,表明問題越容易找到空值首先在中徘徊的位置,越不容易「壞數據」在其他地方會產生令人厭惡的效果(例如,在意識到實際上數據爲空之前,覆蓋準備好向其寫入數據的文件)。

如果你對如何調用你的內部或私人方法很有信心,可能不適合那裏,但對於公共方法,我相信論證驗證幾乎總是合適的。

+1

我完全同意喬恩。你應該檢查那些不在你控制範圍內的參數。在驗證公用方法的參數時,不需要對私有方法的參數執行這些檢查。 – 2011-03-17 12:15:56

+0

+1提私人方法..我不知道! – 2011-03-17 12:19:43

+0

好的,所以每當Pex說它遇到一個NullReferenceException,我應該做一個空測試並拋出一個ArgumentNullException在該方法的頂部? – Calanus 2011-03-17 16:04:13

3

是的,我同意。 A NullReferenceException是嘗試在一個空引用變量上調用成員的結果。這意味着沒有安全防護措施來驗證是否是援引該成員的合法操作,這在我眼中是一件壞事。你應該總是不信任輸入,並驗證它是安全的使用,之前使用它

1

當參數傳遞給一個函數,它暴露了服務時,檢查NULL總是一個好習慣。其餘的NULL檢查是常識,但它是有用的,你可以基本上使用一個輔助方法來做到這一點。

最惱人的NULL檢查是與字符串。他們可以很討厭,但我使用的擴展方法來克服:

public static class StringExtensions 
{ 
    public static string NullSafe(this string s) 
    { 
     return s ?? string.Empty; 
    } 
} 

所以,你可以使用:

myString.NullSafe().ToUpper() 
1

即使從簡單的診斷的角度來看,你有什麼可以獲取有關 - A NullReferenceExceptionArguementNullException

更進一步,從圖片中取出堆棧跟蹤。您的兩條消息可能是:

NullReferenceException: 「對象引用未設置爲對象的實例」。

  • 有些東西是空的,某處我可能並沒有想到它會是。
  • 我可能需要調試才能找到錯誤。

ArguementNullException: 「System.ArgumentNullException:MyVariable的不能爲空。」

  • 我知道null傳遞給方法。
  • 機會是,由變量名稱,我可以縮小到一個較小的一套可能的方法
  • 我仍然可能需要調試,但我應該能夠知道一些放置斷點的一般地方。

另外,檢查你的語法,並閱讀你應該傳遞給ArgumentNullException構造函數的信息。

throw new ArgumentNullException("its null and this shouldn't happen"); 

這是不對的。

throw new ArgumentNullException("VariableName"); 

這是正確的。

相關問題