异常调度如何随未处理的异常处理程序而改变?

时间:2015-12-01 22:06:43

标签: windows winapi exception-handling usermode

简而言之,MSDN describes exception dispatching用于用户模式应用程序,如下所示:

  1. 调试器会收到第一次机会异常(如果已附加)的通知
  2. 一个异常处理程序aka。 try/catch被调用(如果可用)
  3. 调试器会收到第二次机会异常(如果已附加)的通知
  4. 系统关心未处理的异常(通常:终止进程)
  5. 此序列不考虑是否存在未处理的异常处理程序。当存在未处理的异常处理程序时,异常调度如何更改?

1 个答案:

答案 0 :(得分:1)

未处理的异常处理程序插入位置3.序列为:

  1. 调试器会收到第一次机会异常(如果已附加)的通知
  2. 一个异常处理程序aka。 try/catch被调用(如果可用)
  3. 调用未处理的异常处理程序(注意复数形式)(如果可用)
  4. 调试器会收到第二次机会异常(如果已附加)的通知
  5. 系统关心未处理的异常(通常:终止进程)
  6. 以下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