次の方法で共有


Visual Studio でデバッガーで例外を管理する

例外は、プログラムの実行中に発生するエラー状態を示します。 デバッガーに、どの例外や例外のセットで中断するか、またどの時点でデバッガーを中断(つまり、一時停止)させるかを指定できます。 デバッガーが中断すると、例外がスローされた場所が表示されます。 例外を追加または削除することもできます。 Visual Studio でソリューションを開いた状態で、Windows >例外設定>デバッグを使用して、[例外設定] ウィンドウを開きます。

最も重要な例外に応答するハンドラーを提供します。 例外のハンドラーを追加する方法を知る必要がある場合は、「 より優れた C# コードを記述してバグを修正する」を参照してください。 また、一部の例外の実行を常に中断するようにデバッガーを構成する方法についても説明します。

例外が発生すると、デバッガーは例外メッセージを 出力 ウィンドウに書き込みます。 次のような場合に実行が中断される場合があります。

  • 未処理の例外がスローされます。
  • デバッガーは、ハンドラーが呼び出される前に実行を中断するように構成されます。
  • [マイ コードのみ] を設定し、ユーザー コードで処理されない例外を中断するようにデバッガーを構成しました。

ASP.NET には、ブラウザーにエラー ページを表示する最上位の例外ハンドラーがあります。 マイ コードのみを有効にしない限り、実行は中断されません。 例については、以下 の「ユーザーが処理しない例外を続行するようにデバッガーに指示 する」を参照してください。

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# コンソール アプリケーションは、2 つのメソッドを持つクラスを持つクラス ライブラリを参照します。 1 つのメソッドは例外をスローして処理しますが、2 つ目のメソッドは同じ例外をスローしますが、処理しません。

    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() の両方の行で実行が中断されます。

例外設定を既定値に戻すには、[ リストを既定の設定に戻す ] ボタンを選択します。

[例外設定] の [既定値に戻す] のスクリーンショット。

ユーザーが処理しない例外を続行するようにデバッガーに指示する

マイ コードのみを使用して .NET または JavaScript コードをデバッグする場合は、ユーザー コードでは処理されず、他の場所で処理される例外の中断を防ぐようデバッガーに指示できます。

  1. [ 例外設定] ウィンドウで、列ラベルを右クリックしてショートカット メニューを開き、[列 の表示] > [追加アクション] を選択します。 ([ マイ コードのみ] をオフにした場合、このコマンドは表示されません)。 [追加アクション] という名前の 3 番目の列が表示されます。

    [追加アクション] 列のスクリーンショット。

    この列の ユーザー コードで処理されない場合に Continue を示す例外の場合、その例外がユーザー コードで処理されずに外部で処理される場合、デバッガーは続行されます。

  2. 特定の例外に対してこの設定を変更するには、例外を選択し、右クリックしてショートカット メニューを表示し、[ ユーザー コードでハンドルされない場合に続行] を選択します。 共通言語ランタイムの例外全体など、例外のカテゴリ全体の設定を変更することもできます。

    ユーザー コード設定でハンドルされない場合の Continue のスクリーンショット。

たとえば、ASP.NET Web アプリケーションは、例外を HTTP 500 状態コード (ASP.NET Web API での例外処理) に変換することによって処理します。これは、例外のソースを特定するのに役立たない場合があります。 次の例では、ユーザー コードは、String.Format()をスローするFormatExceptionを呼び出します。 実行は次のように中断されます。

ユーザーがハンドルしない例外で中断する

例外の追加と削除

例外を追加および削除できます。 カテゴリから例外の種類を削除するには、例外を選択し、[例外設定] ツール バーのリスト ボタン (マイナス記号) から選択した例外を削除します。 または、例外を右クリックし、ショートカット メニューから [削除 ] を選択します。 例外を削除すると、例外をチェックしない場合と同じ効果があります。それは、例外がスローされたときにデバッガーが中断しないことです。

例外を追加するには:

  1. [ 例外設定] ウィンドウで、例外カテゴリの 1 つ (共通 言語ランタイムなど) を選択します。

  2. [ 選択したカテゴリに例外を追加する ] ボタン (プラス記号) を選択します。

    選択したカテゴリ ボタンに例外を追加するのスクリーンショット。

  3. 例外の名前 ( System.UriTemplateMatchException など) を入力します。

    Type 例外名のスクリーンショット。

    例外が (アルファベット順に) リストに追加され、自動的にチェックされます。

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. 条件行ごとに、モジュールの名前を入力し、比較演算子リストを Equals または Not Equals に変更します。 名前にワイルドカード (\*) を指定して、複数のモジュールを指定できます。

  4. 条件を削除する必要がある場合は、条件行の末尾にある X を選択します。