1

つまり、 MSDN では、ユーザー モード アプリケーションの例外ディスパッチについて次のように説明しています。

  1. デバッガーは最初の例外の通知を受け取ります (接続されている場合)
  2. 例外ハンドラ別名。try/catch呼び出されます (利用可能な場合)
  3. デバッガーは 2 回目の例外の通知を受け取ります (接続されている場合)
  4. システムは未処理の例外を気にします (通常: プロセスを終了します)

このシーケンスでは、未処理の例外ハンドラーの存在は考慮されません。未処理の例外ハンドラが存在する場合、例外ディスパッチはどのように変化しますか?

4

1 に答える 1

1

ハンドルされない例外ハンドラは、3 番目の位置に挿入されます。シーケンスは次のとおりです。

  1. デバッガーは最初の例外の通知を受け取ります (接続されている場合)
  2. 例外ハンドラ別名。try/catch呼び出されます (利用可能な場合)
  3. 未処理の例外ハンドラ (複数形に注意) が呼び出されます (利用可能な場合)
  4. デバッガーは 2 回目の例外の通知を受け取ります (接続されている場合)
  5. システムは未処理の例外を気にします (通常: プロセスを終了します)

次の C# プログラムはそれを示しています。.NET のバージョンによっては、別の未処理の例外ハンドラーのメッセージが表示されます。これは、.NET フレームワークが例外とコール スタックを出力することです。

using System;
namespace UnhandledException
{
    static class Program
    {
        static void Main()
        {
            Console.WriteLine("Please attach the debugger now and press Enter.");
            Console.ReadLine();            
            AppDomain.CurrentDomain.UnhandledException += (sender, e) => Unhandled1();
            AppDomain.CurrentDomain.UnhandledException += (sender, e) => Unhandled2();
            try
            {
                Console.WriteLine("Throwing now.");
                // Will cause a first chance, because in try/catch
                throw new Exception("Any exception will do");
            }
            catch (Exception)
            {
                // Will cause first chance and second chance, because in NOT try/catch
                Console.WriteLine("In catch block.");
                throw;
            }
        }

        static void Unhandled1() => Console.WriteLine("In unhandled exception handler 1");
        static void Unhandled2() => Console.WriteLine("In unhandled exception handler 2");
    }
}

デバッガーで必要なコマンド (WinDbg):

.symfix
.reload
sxe clr
g; *** for the breakpoint due to attaching the debugger
g; *** first chance in try/catch
g; *** first chance outside try/catch
g; *** second chance
于 2015-12-01T22:06:42.847 に答える