Share via


追蹤並修正邏輯錯誤:尋找邏輯錯誤

更新:2007 年 11 月

在本課程中,您將學習如何在您的程式中尋找邏輯錯誤。

在上一個課程中,您已經學會如何尋找並修復編譯器錯誤和執行階段錯誤。第三類程式設計錯誤 ─ 邏輯錯誤,可能是最難發現的錯誤。發生邏輯錯誤時,您完全不會接到警告,因為程式仍然會執行,只是結果不正確而已。然後,您就必須讀完整個程式碼,以判斷發生問題的原因。

所幸,Visual Basic 中的偵錯工具能提供協助。兩項偵錯技巧:設定「中斷點」(Breakpoint) 和「逐步」(Stepping) 偵錯程式碼,可協助您在執行時一次檢查一行程式碼,以尋找錯誤。

您可以在 [程式碼編輯器] 中針對任何可執行的程式碼行設定中斷點。執行程式時,如果到達此程式碼行,中斷點就會強制程式停止並進入中斷模式。然後,您就可以取得該時間點程式狀態的任何相關資訊。您可以檢查任何變數的值、在 [即時運算] 視窗中測試運算式,或是使用 [編輯後繼續] 功能變更您的程式碼。

進入中斷模式之後,您也可以逐步執行程式碼,一次執行一行,以便仔細看清楚程式碼如何運作。按下 F8 鍵,可以讓目前這行程式碼程執行,然後在下一行停止。如此您就可以檢查變數的值,查看這些變數從上一行到下一行的變更方式。

如果目前的程式碼行呼叫程式碼中他處的函式或 Sub 程序,在您按下 F8 時,執行作業就會逐步執行該程序。一旦您已逐步執行該程序,您就會被傳送至呼叫程序那一行後面的程式碼行。如果您不要逐步執行程序,可以按 SHIFT+F8,跳過該程序。

試試看!

若要觀察邏輯錯誤

  1. 在 [檔案] 功能表上,選擇 [新增專案]。

  2. 在 [新增專案] 對話方塊的 [範本] 窗格中,按一下 [Windows 應用程式]。

  3. 在 [名稱] 方塊中,輸入 LogicErrors,再按 [確定]。

    會開啟新的 Windows Form 專案。

  4. 從 [工具箱] 將兩個 TextBox 控制項和 Button 控制項拖曳到表單上。

  5. 按兩下 [Button1],開啟 [程式碼編輯器]。

  6. 在 Button1_Click 事件處理常式中,加入下列程式碼:

    Dim minutes As Integer = CInt(Textbox1.Text)
    Dim miles As Double = CDbl(Textbox2.Text)
    Dim hours As Double = 0
    hours = minutes / 60
    MsgBox("Average speed " & GetMPH(hours, miles))
    
  7. 在 End Sub 行下面,加入以下函式。

    Function GetMPH(ByVal miles As Double, ByVal hours As Double) _
    As String
        GetMPH = CStr(miles / hours)
    End Function
    
  8. 請按 F5 執行程式。在第一個文字方塊中,輸入 10 (代表 10 分鐘),然後在第二個文字方塊中輸入 5 (代表 5 英里),然後再按一下 [Button1]。

    訊息方塊隨即顯示,其中包含訊息「平均速度 0.03333334」。不過,如果您在十分鐘內移動五英里,正確的答案會是 30 mph。

    讓專案保持開啟狀態,因為在下一個程序中,您將學習如何尋找邏輯錯誤。

尋找邏輯錯誤

在上一個範例中,程式邏輯顯然是有些不對勁。根據這個結果,您是以每小時不到一哩的速度前進,不是您所預期的每小時三十哩,但是錯誤出在哪裡?

在下一個程序中,您將設定中斷點,並逐步執行程式碼,以找出錯誤。

試試看!

若要設定中斷點並逐步執行程式碼

  1. 在 [程式碼編輯器] 中,找出程式碼行 hours = minutes / 60,然後按一下該程式碼行的左邊界。

    邊界中應該會出現紅點,而程式碼應該會以紅色反白顯示,代表中斷點。

  2. 按下 F5 再次執行程式。在第一個文字方塊中,輸入 10 並在第二個文字方塊中,輸入 5。然後按一下 [Button1]。

    程式會在到達中斷點時停止。這行程式碼 hours = minutes / 60 會以黃色反白顯示。

    在變數之上按住滑鼠檢查變數值:hours 的值應該是 0,而 minutes 的值應該是 10。

  3. 按下 F8 執行程式碼行 hours = minutes / 60,然後逐步執行下一行。

    檢查 MsgBox("Average speed " & GetMPH(hours, miles)) 行上的變數值:hours 的值現在應該是 0.166666672,而 miles 的值應該是 5.0。

  4. 再次按下 F8,執行目前的程式碼行。

    請注意,執行作業會逐步進行至程式碼行 Function GetMPH。

    檢查這一行上的變數值:您應該會看到 miles 的值現在是 0.166666672,而 hours 的值現在是 5.0,剛好是上一行的相反。您已經找到錯誤了。

    讓專案保持開啟狀態,因為在下一個程序中,您將學習如何修正邏輯錯誤。

修正邏輯錯誤

在前面的程序中,變數 miles 和 hours 的值互相對調。您找出原因了嗎?

如果您仔細看程式碼行 MsgBox("Average speed " & GetMPH(hours, miles)),就會看到傳送了兩個引數給 GetMPH 函式,hours 和 miles,依此順序傳送。如果仔細看函式宣告 Function GetMPH(ByVal miles As Double, ByVal hours As Double)...,您會注意到引數列出順序是:miles 第一而 hours 第二。

發生邏輯錯誤是因為引數的傳遞順序錯誤,導致計算不正確。如果引數是不同類型,可能就會看到執行階段錯誤,但是因為引數是相同類型,所以未發生執行階段錯誤。它是簡單的錯誤,但結果所產生的錯誤卻很難尋找。

在下一個程序中,您將設定中斷點,並逐步執行程式碼,以找出錯誤。

試試看!

若要修正邏輯錯誤

  1. 在 [程式碼編輯器] 中,將程式碼行 MsgBox("Average speed " & GetMPH(hours, miles)) 變更如下所示的樣子:

    MsgBox("Average speed " & GetMPH(miles, hours))
    
  2. 按一下左邊界中的紅點,清除中斷點。

  3. 請按 F5 執行程式。在第一個文字方塊中,輸入 10 並在第二個文字方塊中,輸入 5。然後按一下 [Button1]。

    這次訊息方塊應該會顯示正確的結果 "Average speed 30"。

    現在看起來好像程式已經修正,但是還有另外一個更難找出的邏輯錯誤。如果您要嘗試找出這個錯誤,請讓專案保持開啟,您將在其他錯誤:仍然有地方發生錯誤課程中使用它。

後續步驟

在本課程中,您學會如何尋找並修正邏輯錯誤。現在您可以繼續進行下一個關於使用註解的課程,或者也可以在其他錯誤:仍然有地方發生錯誤課程中試試身手,尋找另一個邏輯錯誤。

下一個課程:建立程式說明:使用註解

請參閱

工作

程式無法執行!尋找並排除執行階段錯誤

了解錯誤:三種程式設計錯誤

尋找錯誤:Visual Basic 偵錯簡介