2011-10-19 39 views
6

我正在清理一些遺留代碼,並找到明確拋出NullReferenceException(例如,在檢查某個類的某些屬性是否爲空或檢查配置時)的方法。由於這種類型的異常是由CLR在空引用的情況下引發的,所以這對於顯式拋出的應用程序來說似乎是一個很差的選擇。明確拋出NullReferenceException的原因是什麼?

我的問題是 - 有沒有任何原因NullReferenceException將是一個很好的選擇,從一個例外顯式拋出代碼?

+0

大概不會,我們檢查參數,有時我們拋出ArgumentNullException但這是良好的參數和參數,不知道... –

回答

9

的文檔NullReferenceException意味着,你不應該從應用程序把它:

注意,應用程序拋出ArgumentNullException例外,而不是這裏討論的NullReferenceException異常。

我相信我已經看到過別處的指導(目前找不到任何東西),您應該避免拋出運行時拋出的異常類型(儘管我即將鏈接到顯示運行時拋出一個「應用程序」除外)


如果你的方法內檢查性能,在繼續之前,這聽起來像你可能想用InvalidOperationException來替代它們:

出現InvalidOperationException是用於調用方法失敗的原因是由於無效參數以外的原因造成的。

處於方法調用的錯誤狀態聽起來像它符合此定義。

0

我可以在invision senarios中明確地拋出它是有意義的。首先想到的是在CLR遇到異常之前完成大量其他處理之前檢查屬性。

+0

不應該ArgumentNullException應該用於這些場景的屬性? – DaveHogan

1

我假設如果代碼沒有檢查你會得到一個NullReferenceException(NRE)任何方式,所以沒有。然而,我沒有看到有一個應用程序消息沒有問題,它可以更好地解釋具有內部異常類型NRE或ArgumentExeption的特定函數的調用機制,因爲這是導致問題的下屬問題。

2

MSDN這樣說:

注意,應用程序拋出ArgumentNullException異常 而不是這裏討論的NullReferenceException異常。

所以你的問題的答案可能是「不」。

5

不,沒有理由拋出NullReferenceException

你總是有一些關於錯誤原因的更多信息,所以你應該拋出一個異常傳達的信息。

例如,如果您在不允許的情況下獲取空引用作爲參數,則會拋出ArgumentExceptionArgumentNullException

2

沒有,NullReferenceException應該只由框架拋出。 ArgumentNullExceptionInvalidOperationException是有效的選擇。

+1

不應在這種情況下使用[NotSupportedException異常](http://msdn.microsoft.com/en-us/library/system.notsupportedexception.aspx):「對於場景中有時可能爲對象來執行所請求操作,並且對象狀態決定是否可以執行操作,請參閱InvalidOperationException。 –

+0

已更新........ – devdigital

相關問題