在 Windows 窗體中為簡單的 NullReferenceException 堆疊跟蹤
讓我們建立一小段丟擲異常的程式碼:
private void button1_Click(object sender, EventArgs e)
{
string msg = null;
msg.ToCharArray();
}
如果我們執行此操作,我們將獲得以下異常和堆疊跟蹤:
System.NullReferenceException: "Object reference not set to an instance of an object."
at WindowsFormsApplication1.Form1.button1_Click(Object sender, EventArgs e) in F:\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:line 29
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
堆疊跟蹤繼續這樣,但這部分足以滿足我們的目的。
在堆疊跟蹤的頂部,我們看到了這一行:
在 F:\ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Form1.cs 中的 WindowsFormsApplication1.Form1.button1_Click(Object sender,EventArgs e):第 29 行
這是最重要的部分。它告訴我們發生異常的確切行:Form1.cs 中的第 29 行。
所以,這是你開始搜尋的地方。
第二行是
在 System.Windows.Forms.Control.OnClick(EventArgs e)
這是呼叫 button1_Click
的方法。所以現在我們知道發生錯誤的 button1_Click
是從 System.Windows.Forms.Control.OnClick
呼叫的。
我們可以這樣繼續下去; 第三行是
在 System.Windows.Forms.Button.OnClick(EventArgs e)
反過來,這就是呼叫 System.windows.Forms.Control.OnClick
的程式碼。
堆疊跟蹤是在程式碼遇到異常之前呼叫的函式列表。通過這樣,你可以找出程式碼在遇到問題之前遵循的執行路徑!
請注意,堆疊跟蹤包括來自 .Net 系統的呼叫; 你通常不需要遵循所有的微軟 System.Windows.Forms
程式碼來找出問題所在,只有屬於你自己的應用程式的程式碼。
那麼,為什麼這被稱為堆疊跟蹤?
因為,每次程式呼叫一個方法時,它都會跟蹤它的位置。它有一個稱為堆疊的資料結構,它會轉儲它的最後一個位置。
如果執行完該方法,它會在堆疊上檢視它在呼叫方法之前的位置 - 並從那裡繼續。
因此,在呼叫新方法之前,堆疊可以讓計算機知道它停在哪裡。
但它也可以作為除錯幫助。就像一名偵探追蹤犯罪分子犯罪時所採取的步驟一樣,程式設計師可以使用堆疊來追蹤程式在崩潰之前所採取的步驟。