2014-04-05 21 views
2

是否有可能看到何時NullReference異常被捕獲哪個字段爲空?捕獲NullReference異常時,獲取哪個字段爲空?

我知道你可以讀取堆棧跟蹤行號,但在該行可能有多個字段可能導致NullReference異常。

恐怕這是不可能的,但如果是這樣,爲什麼這在技術上是不可能的?

+1

Eric Lippert在[這個問題]上回答了這個問題[0124](http://stackoverflow.com/questions/8407789/can-visual-studio-tell-me-which-reference-threw-a-nullreferenceexception) – anaximander

回答

0

是的,這是可能的。您可以在try-catch之外對變量進行範圍,然後將它們添加到異常。但是,在你使用它們之前,你應該檢查你的可爲空的變量爲null。最好總是如果你不是100%確定它不能爲空。

此代碼崩潰在Console.WriteLine();,但現在我確切地知道哪些參數是導致它:

int? a = (int?)null; 
int? b = (int?)null; 

try 
{ 
    Console.WriteLine(a.Value + b.Value); 
} 
catch (Exception ex) 
{ 
    ex.Data.Add("a", a); 
    ex.Data.Add("b", a); 

    throw; 
} 
+0

沒有知道ex.Data.Add(),這可能是有用的。但在你的例子中,它需要手動操作(你需要讀取每個可能的變量),這些變量必須在try-catch之外。這也不適用於第三方代碼。 –

+0

你所說的「手動操作」並不是一件壞事。特別是如果您使用第三方代碼。如果你自己沒有生成,我強烈建議你總是驗證你的輸入。經常檢查一切是否如你所期望的那樣使用檢查和例外。所以如果你在方法開始時檢查了輸入,那麼你知道變量在try-catch範圍之外是100%安全的。這樣,你的try-catch沒有很多代碼,這反過來又使它更容易調試。這些例外情況也將包含整個失敗的情況。 – Trafz

+0

我有點困惑'也這不會與第三方代碼工作。「。因爲您可以輕鬆實例化將要使用的第三方類,並在進入try-catch之前將其設置爲null。但是你是對的,你不能把這個代碼放到第三方庫中。你只能希望他們也能這樣發展他們的嘗試。然後,他們的異常數據會在.Data中有很多信息,您可以讀取並保存到您自己的.Data中。 – Trafz

0

您是Code Contracts之後,從System.Diagnostics.Contracts納秒。我認爲它來自.NET FW 4.0。 它可以在您的代碼中評估前期和後期條件,避免出現黑暗的NullReferenceException這樣的頭痛。你卑鄙地這樣做:

Contract.Requires(x!= null);

+0

第三方代碼呢?這仍然意味着你必須修改你的代碼。但有趣的測試雖然。 –