我目前正在维护一个WinForms应用程序,它监听Application.ThreadException
事件以捕获GUI线程上未处理的异常。
现在直到最近,事情一直在发挥作用。但最近,这个事件不再适用于某些生产箱;当GUI线程上存在未处理的异常时,应用程序会跳过处理程序并崩溃。奇怪的是,我能够在我的(新)开发盒上重现这个,但是有些机器事实上正在被正确引发。
我可以通过显式设置这样的策略来使行为保持一致:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
但我很想知道什么控制了默认策略。 MSDN对“应用程序配置文件”进行了模糊的暗示,但我们的app.config或我知道的任何其他配置文件中都没有这样的策略设置。
导致这种不一致行为的原因是什么?
答案 0 :(得分:1)
我只能想到一个。异常处理逻辑知道是否附加了调试器。当默认的UnhandledExceptionMode.Automatic生效时,这很重要。附加调试器时,Winforms消息循环不尝试捕获异常。这相当重要,它会使调试异常变得相当困难。调试器仅在未处理异常时进入并显示异常助手。
使用UnhandledExceptionMode.CatchException是可以的,它使异常处理保持一致。换句话说,它在您的开发机器上的行为与在客户机器上的行为完全相同。但是你现在需要Debug + Exceptions,Thrown框来解决代码问题。这总是使调试器在抛出异常时停止,无论它是否被捕获。
答案 1 :(得分:0)
我也开始体验这一点。我们试图调试我们的测试人员看到的异常,并且无法在我们自己的机器上重现。我在VS和中提琴中打开了例外停止行为,实际上发生了异常。但是,如果我继续使用F11,我会看到异常只是被忽略了。
我有两台机器。一台机器是Win 7 64位,安装了VS 2008和VS 2010,因此安装了.Net 4.0。我们正在测试的应用程序是.Net 3.5并在VS 2008中进行了调试。
另一台机器是Win XP 32位,普通简VS 2008和.Net 3.5。
Win 7机器默默地忽略了。 XP机器大声抱怨。我认为安装.Net 4.0改变了一些默认策略。
我通过致电
解决了这个问题Application.SetUnhandledExceptionMode( UnhandledExceptionMode.CatchException );