是否有可能看到何時NullReference異常被捕獲哪個字段爲空?捕獲NullReference異常時,獲取哪個字段爲空?
我知道你可以讀取堆棧跟蹤行號,但在該行可能有多個字段可能導致NullReference異常。
恐怕這是不可能的,但如果是這樣,爲什麼這在技術上是不可能的?
是否有可能看到何時NullReference異常被捕獲哪個字段爲空?捕獲NullReference異常時,獲取哪個字段爲空?
我知道你可以讀取堆棧跟蹤行號,但在該行可能有多個字段可能導致NullReference異常。
恐怕這是不可能的,但如果是這樣,爲什麼這在技術上是不可能的?
OK,我沒有看到這些問題不幸的是:
Can Visual Studio tell me which reference threw a NullReferenceException? (感謝@anaximander)
Detecting what the target object is when NullReferenceException is thrown (感謝@Rohit VATS)
這些答案解釋得非常好。
今天事情有點動了,看看System.Diagnostics.Contracts命名空間 –
是的,這是可能的。您可以在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;
}
沒有知道ex.Data.Add(),這可能是有用的。但在你的例子中,它需要手動操作(你需要讀取每個可能的變量),這些變量必須在try-catch之外。這也不適用於第三方代碼。 –
你所說的「手動操作」並不是一件壞事。特別是如果您使用第三方代碼。如果你自己沒有生成,我強烈建議你總是驗證你的輸入。經常檢查一切是否如你所期望的那樣使用檢查和例外。所以如果你在方法開始時檢查了輸入,那麼你知道變量在try-catch範圍之外是100%安全的。這樣,你的try-catch沒有很多代碼,這反過來又使它更容易調試。這些例外情況也將包含整個失敗的情況。 – Trafz
我有點困惑'也這不會與第三方代碼工作。「。因爲您可以輕鬆實例化將要使用的第三方類,並在進入try-catch之前將其設置爲null。但是你是對的,你不能把這個代碼放到第三方庫中。你只能希望他們也能這樣發展他們的嘗試。然後,他們的異常數據會在.Data中有很多信息,您可以讀取並保存到您自己的.Data中。 – Trafz
您是Code Contracts之後,從System.Diagnostics.Contracts納秒。我認爲它來自.NET FW 4.0。 它可以在您的代碼中評估前期和後期條件,避免出現黑暗的NullReferenceException這樣的頭痛。你卑鄙地這樣做:
Contract.Requires(x!= null);
第三方代碼呢?這仍然意味着你必須修改你的代碼。但有趣的測試雖然。 –
Eric Lippert在[這個問題]上回答了這個問題[0124](http://stackoverflow.com/questions/8407789/can-visual-studio-tell-me-which-reference-threw-a-nullreferenceexception) – anaximander