在.NET 1.x的Windows窗体应用程序未处理的异常行为取决于:
- 线程抛出异常
- 无论是窗口消息处理
- 期间是否发生一个调试器的类型被安装在处理
- 的DbgJitDebugLaunchSetting注册表中App.Config中
设置
- 的jitDebugging标志210
- 无论你推翻了Windows窗体异常处理程序
- 无论您处理的CLR的异常事件
- 月亮的相位
未处理异常的默认行为是:
- 如果在抽取窗口消息时主线程发生异常,它被Windows窗体异常处理程序拦截。
- 如果在抽取窗口消息时主线程发生异常,它将终止应用程序进程,除非它被Windows窗体异常处理程序拦截。
- 如果在手动,线程池或终结器线程上发生异常,它将被CLR吞噬。
对未处理的异常的接触点是:
- Windows窗体异常处理程序。
- JIT调试注册表开关DbgJitDebugLaunchSetting。
- CLR未处理的异常事件。
Windows窗体内置的异常处理在默认情况下执行以下操作:
- 捕捉到一个未处理的异常时:
- 的例外是主线程和没有调试器连接。
- 窗口消息处理期间发生异常。
- jitDebugging =在App.Config中为false。
- 向用户显示对话框并阻止应用程序终止。
您可以通过在App.Config中设置jitDebugging = true来禁用后者的行为。但请记住,这可能是您停止应用程序终止的最后机会。因此,下一步捕捉未处理的异常被注册为事件Application.ThreadException,例如:
Application.ThreadException += new
Threading.ThreadExceptionHandler(CatchFormsExceptions);
注册表注意在HKEY_LOCAL_MACHINE \ Software.NetFramework设置DbgJitDebugLaunchSetting。这有我知道的三个值之一:
- 0:显示用户对话框询问“调试或终止”。
- 1:让异常通过CLR来处理。
- 2:启动DbgManagedDebugger注册表项中指定的调试器。
在Visual Studio中,进入菜单工具→选项→调试→JIT到此项设置为0或2,但值为1,通常最好是在最终用户的机。请注意,此注册表项在CLR未处理的异常事件之前执行。
这最后一个事件是您最后一次记录未处理异常的机会。它在Finally块执行之前触发。您可以如下拦截此事件:
AppDomain.CurrentDomain.UnhandledException += new
System.UnhandledExceptionEventHandler(CatchClrExceptions);