在 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 程式碼來找出問題所在,只有屬於你自己的應用程式的程式碼。

那麼,為什麼這被稱為堆疊跟蹤
因為,每次程式呼叫一個方法時,它都會跟蹤它的位置。它有一個稱為堆疊的資料結構,它會轉儲它的最後一個位置。
如果執行完該方法,它會在堆疊上檢視它在呼叫方法之前的位置 - 並從那裡繼續。

因此,在呼叫新方法之前,堆疊可以讓計算機知道它停在哪裡。

但它也可以作為除錯幫助。就像一名偵探追蹤犯罪分子犯罪時所採取的步驟一樣,程式設計師可以使用堆疊來追蹤程式在崩潰之前所採取的步驟。