在 Visual Studio 中用除錯器管理例外

例外是程式執行時發生錯誤狀態的指示。 你可以告訴除錯器要針對哪些例外或一組例外來中斷,以及你希望除錯器在哪個時候中斷(也就是在除錯器中暫停)。 當偵錯器中斷時,它會顯示異常被引發的位置。 你也可以新增或刪除例外。 在 Visual Studio 開啟解決方案後,使用 Debug > Windows > Exception Settings 開啟 Exception Settings 視窗。

提供能回應最重要異常狀況的處理器。 如果你需要知道如何新增例外處理程序,請參考「 透過撰寫更好的 C# 程式碼修正錯誤」。 另外,學會如何設定除錯器在某些例外時總是中斷執行。

當發生例外時,除錯器會寫入異常訊息到 輸出 視窗。 在以下情況下,可能會中斷執行:

  • 會拋出一個例外,但未被處理。
  • 除錯器設定為在任何處理器被呼叫前就中斷執行。
  • 你已設定 Just My Code,並讓除錯器在所有未被使用者程式碼處理的例外發生時中斷。

備註

ASP.NET 有一個頂層例外處理程式,可以在瀏覽器中顯示錯誤頁面。 除非開啟 Just My Code ,否則不會破壞執行。 範例請參見下方「 告訴除錯器繼續處理使用者未處理的例外 」。

備註

在 Visual Basic 應用程式中,除錯器會將所有錯誤視為例外處理,即使你使用 On Error 風格的錯誤處理程序。

告訴除錯器在拋出例外時中斷

除錯器可以在拋出異常時中斷執行,因此你可以在呼叫處理器前檢查該例外。

例外設定視窗(除錯 > Windows > 例外設定)中,展開節點以顯示某一例外類別,例如通用語言執行時例外。 接著在該類別中勾選特定例外的勾選框,例如 System.AccessViolationException。 你也可以選擇一整類例外。

例外設定對話框的截圖。

例外設定勾選框的截圖。

小提示

你可以透過例外設定工具列中的搜尋視窗找到特定例外,或用搜尋篩選特定命名空間(例如 System.IO)。

如果你在 例外設定 視窗中選擇例外,除錯器執行會在該例外被拋出的地方中斷,不管該例外是否被處理。 這個例外稱為首次機會例外。 舉例來說,以下是幾個情境:

  • 在以下的 C# 主控台應用程式中,Main 方法會在 內拋出 try/catch

    static void Main(string[] args)
    {
        try
        {
            throw new AccessViolationException();
            Console.WriteLine("here");
        }
        catch (Exception e)
        {
            Console.WriteLine("caught exception");
        }
        Console.WriteLine("goodbye");
    }
    

    如果你在例外設定中勾選了 AccessViolationException,當你在除錯器執行這段程式碼時,執行會在該throw行中斷。 接著你可以繼續執行。 控制台應該會顯示這兩行:

    caught exception
    goodbye
    

    但它不會顯示那 here 條線。

  • C# 主控台應用程式會參考一個類別函式庫,該類別包含兩個方法。 一個方法是拋出例外並處理它,另一個方法則拋出相同例外但不處理。

    public class Class1
    {
        public void ThrowHandledException()
        {
            try
            {
                throw new AccessViolationException();
            }
            catch (AccessViolationException ave)
            {
                Console.WriteLine("caught exception" + ave.Message);
            }
        }
    
        public void ThrowUnhandledException()
        {
            throw new AccessViolationException();
        }
    }
    

    這是主控台應用程式的 Main() 方法:

    static void Main(string[] args)
    {
        Class1 class1 = new Class1();
        class1.ThrowHandledException();
        class1.ThrowUnhandledException();
    }
    

    如果你在例外設定中勾選了 AccessViolationException,當你在除錯器執行這段程式碼時,throwThrowUnhandledException() 兩行的執行都會中斷

要將例外設定恢復為預設值,請選擇 「還原清單至預設設定 」按鈕:

異常設定中還原預設值按鈕的截圖。

例外設定中「還原預設值」的截圖。

告訴除錯器繼續處理使用者未處理的例外

如果您正使用 Just My Code 來除錯 .NET 或 JavaScript 程式碼,可以告訴除錯器避免在使用者程式碼中未處理但在其他地方已處理的例外時中斷。

  1. 例外設定 視窗中,透過右鍵點擊欄位標籤開啟捷徑選單,然後選擇 「顯示欄位 > 額外動作」。 (如果你關閉 了 Just My Code,你就看不到這個指令。)第三欄名為 「額外行動 」。

    附加行動欄截圖。

    對於在這一欄顯示使用者程式碼中未處理時繼續的例外情況,如果該例外在使用者程式碼中未被處理但被外部處理,除錯器將繼續。

  2. 要更改特定例外的設定,請選擇該例外,右鍵點擊以顯示快捷選單,然後選擇「在使用者程式碼中未處理時繼續」。 你也可以更改整個例外類別的設定,例如整個通用語言執行時例外)。

    使用者程式碼設定中未處理繼續時的截圖。

例如,ASP.NET 網頁應用程式會將例外轉換成 HTTP 500 狀態碼(ASP.NET Web API 中的例外處理),這可能無法幫助你判斷例外的來源。 在下面的範例中,使用者程式碼呼叫 String.Format(),這會拋出一個 FormatException。 執行中斷如下:

截圖顯示 System.FormatException。

使用者未處理例外時的中斷

新增與刪除例外

你可以新增或刪除例外。 要從類別中刪除例外類型,請選擇該例外,並在例外設定工具列中選擇「從清單刪除所選例外」按鈕(負號)。 或者你也可以右鍵點例外,然後從捷徑選單中選擇 刪除 。 刪除例外的效果與取消勾選該例外相同,也就是說,當它被拋出時,除錯器不會中斷。

補充一個例外:

  1. 例外設定 視窗中,選擇其中一個例外類別(例如, 通用語言執行環境)。

  2. 選擇 「新增例外」按鈕 (加號)。

    新增例外於所選類別按鈕的截圖。

    新增例外到所選類別按鈕的截圖。

  3. 輸入例外名稱(例如 System.UriTemplateMatchException)。

    截圖顯示例外名稱。

    例外類型名稱的截圖。

    例外會被加入清單(按字母順序)並自動勾選。

若要在 GPU 記憶體存取例外、JavaScript 執行時例外或 Win32 例外類別中新增例外,請包含錯誤代碼與描述。

小提示

檢查拼字! 例外設定視窗不會檢查是否有新增例外。 所以如果你輸入 Sytem.UriTemplateMatchException,你會看到該例外的條目(而不是 System.UriTemplateMatchException)。

例外設定會持續存在於解決方案的 .suo 檔案中,因此會套用到特定解決方案。 你不能在不同解決方案間重複使用特定的例外設定。 現在只有新增的例外會被保留;刪除的例外則不會。 你可以新增例外,關閉再重新開啟解決方案,例外依然存在。 但如果你刪除例外並關閉或重新開啟解決方案,該例外會重新出現。

例外設定視窗支援 C# 中的通用例外類型,但在 Visual Basic 中則不支援。 要在例外發生時中斷:MyNamespace.GenericException<T>必須將例外加入MyNamespace.GenericException`1。 也就是說,如果你建立了像這段程式碼這樣的例外:

public class GenericException<T> : Exception
{
    public GenericException() : base("This is a generic exception.")
    {
    }
}

你可以使用之前的程序將例外加入 例外 設定:

截圖顯示如何新增通用例外。

新增通用例外的截圖。

為例外加入條件

請使用 例外設定 視窗來設定例外條件。 目前支援的條件包括例外中可包含或排除的模組名稱。 透過將模組名稱設為條件,你可以選擇只在特定程式碼模組中斷例外。 你也可以選擇避免在特定模組中中斷。

備註

從 Visual Studio 2017 開始,支援為例外新增條件。

補充條件例外:

  1. 在例外設定視窗中選擇 「編輯條件 」按鈕,或右鍵點擊異常後選擇 「編輯條件」。

    例外條件截圖。

    例外條件的截圖。

  2. 若要為例外新增額外必要條件,請為每個新條件選擇 新增條件 。 額外的條件線會顯示。

    顯示例外額外條件的截圖。

    這是例外額外條件的截圖。

  3. 對每條條件線,輸入模組名稱,並將比較運算子列表改為 EqualsNot Equals。 你可以在名稱中指定萬用字元(\*),以指定多個模組。

  4. 如果你需要刪除條件,請選擇條件行末尾的 X