代码之家  ›  专栏  ›  技术社区  ›  Martin Brown

当UnhandledExceptionMode设置为UnhandledExceptionMode.Automatic时,哪个.config元素会影响异常处理?

  •  9
  • Martin Brown  · 技术社区  · 17 年前

    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.Automatic);
    

    UnhandledExceptionMode.Automatic 它指出:

    自动的 ThreadException处理程序,除非 应用程序的配置文件

    有人确切知道配置文件中影响此设置的元素/属性吗?

    3 回复  |  直到 17 年前
        1
  •  5
  •   JoshL    14 年前

    您可以向配置文件中添加JITDebuging节,如下所示:

    <configuration>
      <system.windows.forms jitDebugging="true"/>
    </configuration>
    

    这相当于将UnhandledExceptionMode设置为 UnhandledExceptionMode.ThrowException (顺便说一句,如果在运行应用程序时附加了调试器,则会自动启用此选项)。

    UnhandledExceptionMode.Automatic 是.Net使用的默认值,除非您另行指定;据我所知,将未处理异常模式显式设置为Automatic的唯一原因是,如果要撤消以前将其更改为其他内容的调用。请注意,如果将其设置为非自动,则不会读取配置文件设置。

    请注意,如果将ThreadException附加到当前AppDomain,则结果将自动显示,就像您已将UnhandledExceptionMode设置为 UnhandledExceptionMode.CatchException

        2
  •  2
  •   Martin Brown    17 年前

    我也想知道这一点,但我从来没有找到任何关于您可以设置的任何特定内置配置选项的信息(可能有一个,但我从来没有发现它是什么)。我认为我们还发现默认行为(如果您不这样做)等同于ThroweException模式,与MSDN在该引用中的含义相反。此外,我认为将其设置为自动相当于根本不触摸它;首先,它已经是自动的了。

    然而,我确实发现有两个 SetUnhandledExceptionMode . 正常的设置是基于每个线程(通常只有一个UI线程),但第二个设置也采用布尔值,该布尔值确定设置是仅应用于当前线程(true)还是应用于所有UI线程(false)。传递false的行为类似于为未来的UI线程设置默认设置,前提是这些线程保留在 Automatic Application.Run ),您可以将自己的配置选项挂接到该调用中,以设置全局默认值。我不得不怀疑,他们是否真的在使用模糊的“配置”引用。

    不过要注意的是,这是一种召唤吗 必须在同一上下文中创建任何窗口句柄之前完成。因此,必须在上创建任何窗口句柄之前使用false调用它 任何 线另外,VisualStudio调试器显然会导致在代码启动之前存在窗口句柄,因此调试时此调用永远不会成功(如果为false)。但是,该窗口句柄不在线程上,因此可以在调试场景中安全地完成正常调用(或使用true)。我不确定WinForms应用程序位于已创建的子域中而不是作为顶级/初始域的其他情况下,这是如何运行的,子域是否继承了any handle created标志或重新开始。也许这就是VisualStudio案例中的实际问题。

    在该线程上创建任何窗口句柄之前,仍然必须进行普通调用(或使用true)。我相信,如果您随后重新进入应用程序上下文,则此设置将持续到应用程序上下文的退出 应用程序。运行 Application.ThreadException 基于每个线程、每个上下文,并且在 出口。它也只能有一个订户(覆盖以前的任何订户),并且在消息循环运行时不能更改。所以如果你打电话 应用程序。运行 同样,您必须重新订阅 Application.ThreadException 打电话之前 应用程序。运行 ,否则它们将被捕获并发送到默认的WinForms处理程序(我不是说UnhandledException),因为“异常模式”设置仍然存在。通常,您不会在同一个线程上不断地输入和退出消息循环,因此这不是问题,但我们遇到了它,因为我们必须在 Gibraltar.Agent

    AppDomain.UnhandledException