什么时候.NET WinForms应用程序中的异常只是被吃掉而没有被捕获或冒泡到Windows异常?

Dav*_*vy8 5 c# unhandled-exception winforms

在我们的代码中的几个地方,我们注意到如果在调试器下运行,它将显示代码中存在未处理的异常,但是如果在调试器外部运行它将完全忽略异常,就好像它被捕获一样.我们有一个异常处理程序,它弹出一个连接到Application.ThreadException和AppDomain.CurrentDomain.UnhandledException的错误提交对话框.这些都不会捕获它们.我们还记录了我们的异常,日志中没有任何内容.

这有什么可能的原因?

编辑:似乎它不依赖于异常抛出的类型,而是它抛出的位置.仅通过添加以下测试:

throw new Exception("Test Exception");
Run Code Online (Sandbox Code Playgroud)

它将显示在调试器下但不会显示在外部,因此在我们的示例中,它不是ThreadAbortedException或任何依赖于它的特定类型的异常.

Dav*_*vy8 1

发现可能发生这种情况的一个地方是 UnhandledException 事件处理程序中存在异常。看到这一点的一个简单方法是:在 Form.Load 事件处理程序中抛出任何旧的异常。在 Application.ThreadException 事件中放置类似于以下内容的内容:

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
     string b = null;
     int i = b.Length;
}
Run Code Online (Sandbox Code Playgroud)

在调试器下,它会显示您的异常未被用户代码处理,然后它将在 ThreadException 处理程序中显示一个空引用异常,但如果您在调试器之外运行它,它只会像处理异常一样吞掉异常。