正如一些答案指出的,告訴Visual Studio在拋出NullReferenceException時中斷。
如何告訴VS打破時未處理的異常拋出
- 調試菜單|異常(或按Ctrl + Alt鍵+Ë)
- 鑽入通用語言運行時異常
- 鑽入系統
- 查找System.NullRefernceException,並檢查框打破每當這個異常被拋出,而不是允許它繼續執行任何Catch塊。
所以現在,當它發生時,VS會立即中斷,Current Statement行將被放在表達式中評估爲null。
這個設施是所有類型的異常,包括自定義的有用的(可以添加完全限定的類型名稱,和VS將調試時間匹配它)
的一個缺點這種方式是否有碼加載到調試器中,該調試器遵循拋出的錯誤做法並捕獲許多您正在尋找的異常,在這種情況下,它會變成草垛/針頭問題(除非您可以修復該代碼 - 然後您已經解決了兩個問題:)
另一個可能派上用場的竅門(但只限於某些語言)是使用o F中的當(或等同物)關鍵字...在VB中,這看起來像
Try
' // Do some work '
Catch ex As Exception When CallMethodToInspectException(ex)
End Try
這裏的訣竅在於,當表達式求值之前調用堆棧被退繞至Catch塊。因此,如果您使用調試器,則可以設置表達式的斷點,並且如果您查看callstack窗口(Debug | Windows | Callstack),則可以看到並導航到觸發異常的行。 (您可以選擇從CallMethodToInspectException返回false,因此Catch塊將被忽略,並且運行時將繼續通過堆棧搜索相應的Catch塊 - 這可以允許進行不會影響行爲的日誌記錄,並與超過漁獲物和再次引發開銷更少)
如果你在非交互記錄只是感興趣,那麼假設你有一個調試版本(或在一定程度上,你必須做處理優化問題,使用PDB發佈構建),您可以獲得大部分從Exception ToString跟蹤錯誤所需的信息,包括堆棧跟蹤與行號。
但是,如果行號不夠,您可以通過爲異常提取StackTrace(使用上述技術或僅使用上面的技術)來獲得列號(非常多,特定的本地或表達式爲null)在catch塊本身):
int colNumber = new System.Diagnostics.StackTrace(ex, true).GetFrame(0).GetFileColumnNumber();
雖然我還沒有看到它做什麼的NullReference或其他運行時產生的異常,還可能有興趣在Exception Hunter看作爲一個靜態分析工具。
我不明白 - 如果您將調試器設置爲在NullReferenceExceptions上中斷,當然你可以看到哪個變量在引發異常的時候導致了錯誤? – Grokys 2008-09-22 15:39:57