我有一个Windows Forms应用程序,在程序启动时有以下代码:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.Automatic);
在UnhandledExceptionMode.Automatic的MSDN文档中,它指出:
有人知道配置文件中影响此设置的确切元素/属性是哪个吗?Automatic - 将所有异常路由到ThreadException处理程序,除非应用程序的配置文件另有规定。
我有一个Windows Forms应用程序,在程序启动时有以下代码:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.Automatic);
有人知道配置文件中影响此设置的确切元素/属性是哪个吗?Automatic - 将所有异常路由到ThreadException处理程序,除非应用程序的配置文件另有规定。
您可以像这样向配置文件添加JitDebugging部分:
<configuration>
<system.windows.forms jitDebugging="true"/>
</configuration>
这相当于将UnhandledExceptionMode设置为UnhandledExceptionMode.ThrowException
(顺便说一下,如果您在调试器附加的情况下运行应用程序,则此选项会自动启用)。
请注意,除非您另有指定,否则.Net默认使用UnhandledExceptionMode.Automatic
;据我所知,显式将未处理异常模式设置为自动模式的唯一原因是想撤消先前更改为其他选项的调用。请注意,如果您将其设置为其他值而不是自动模式,则不会读取配置文件设置。
请注意,如果将ThreadException附加到当前AppDomain,则结果将自动与将UnhandledExceptionMode设置为UnhandledExceptionMode.CatchException
相同。
SetUnhandledExceptionMode
有两个重载。正常的重载基于每个线程(通常你只有一个UI线程),但第二个重载还带有一个布尔值,该值确定设置是否仅应用于当前线程(true)或所有UI线程(false)。传递false就像为未来的UI线程设置默认设置一样,如果它们在启动时保持在Automatic
模式下(我的意思是消息循环,即调用Application.Run
),并且你可以将自己的配置选项连接到这个调用中以设置全局默认值。我不得不想知道他们所说的含糊的“config”参考是否就是这个。SetUnhandledExceptionMode
必须在同一上下文中创建任何窗口句柄之前完成。 因此,在任何线程上创建任何窗口句柄之前,必须使用false进行调用。此外,据称Visual Studio调试器会在代码启动之前存在一个窗口句柄,因此当进行调试时,这个调用永远不会成功(使用false)。但是,该窗口句柄不在您的线程上,因此在调试场景中可以安全地进行正常调用(或使用true)。我不确定在WinForms应用程序位于已创建的子域中而不是作为顶部/初始域的其他情况下,它会如何表现,是否子域继承了任何句柄创建标志或者能够重新开始。也许这就是Visual Studio案例的实际问题。Application.Run
(与已创建的句柄标志一样),则此设置将持续存在于应用程序上下文退出后。但请注意,对Application.ThreadException
的订阅是基于每个线程,每个上下文的基础,并且将在Application.Run
退出时丢失。它还只能有一个订阅者(覆盖任何先前的订阅者),并且不能在消息循环运行时更改。因此,如果您再次调用Application.Run
,则必须在调用Application.Run
之前重新订阅Application.ThreadException
,否则它们将被捕获并发送到默认的WinForms处理程序(我不是指UnhandledException),因为“异常模式”设置会持续存在。通常,您不会在同一线程上不断进入和退出消息循环,因此这不是问题,但我们在Gibraltar.Agent中遇到了这个问题,因为我们必须这样做。