Ozz*_*zah 5 .net c# debugging exception-handling exception
可能重复:
发布模式下的异常处理问题
我怀疑对此有一个非常简单的解释,但我似乎无法找到它.
当我的WinForms C#4.0应用程序在Program.cs文件中加载自身时,整个Main()函数内部都有一个try/catch语句.
我编写了一个小异常包装器,其行为与vanilla .net"未捕获异常"框非常相似,除了它提供了更多信息,允许保存(序列化)异常树,并允许用户提交错误直接向我汇报.
现在,它在调试时工作正常(F5).如果我在主线程中的程序中的任何地方触发异常,如果没有try/catch,则异常会一直触发到Main()并显示自定义窗口.
(我已经考虑并妥善处理的所有其他例外情况).
当我仅通过运行.exe文件运行程序时,会出现vanilla .net异常框,而不是我编码的那个.
有什么理由可以想到为什么会发生这种情况?最奇怪的是,它在调试模式下运行与自行运行时的行为完全不同.我正在构建为调试 - 而不是发布.
编辑(3月22日至11日):
我只是在这里添加一个小附录,以防你们中的一些人无法在下面接受的答案的评论中找到答案:忘记我说我正在构建调试而不是发布.这没有关系 - 我只是添加它以获取额外信息.重要的是,当我在VS中调试ging时,异常会按预期被捕获,但是当在VS外部执行我的EXE时,它们不是.
正如Cody所说,Application.Run()
它有自己的异常处理程序,这就是为什么它们永远不会到达我的主要部分catch
,但我提到我甚至没有Application.Run()
在我的代码中使用任何地方...而是我的GUI首先启动Form.ShowDialog()
.
我已经做了一些实验,并且可以确认Form.ShowDialog()
行为与Application.Run()
在方法本身内处理异常的行为相同.
这是预期的行为.
您看到的差异是应用程序在附加调试器的情况下运行的结果.当您从Visual Studio中启动它时,调试器会自动附加(当然,除非您选择"Start Without Debugging").这会禁用内置的异常处理程序,该异常处理程序负责向您显示"vanilla".NET异常对话框.从外部VS启动它不会附加调试器,从而启用内置异常处理.(请注意,这与在"调试"模式下与"发布"模式编译程序无关.)
见接受的答案来此相关的问题的详细信息.我不相信VB.NET和C#之间的区别在这种情况下是相关的.
作为这个问题的答案提到的,还有就是禁用内置的异常处理的方式.但在选择之前,我建议您重新考虑您的方法.您可以考虑处理内置事件,而不是将整个Main
方法包装在try-catch块中,这听起来像是一些代码味道.Jeff Atwood 在Code Project上发表了一篇很棒的文章,讲述了如何用你自己更友好的方法替换标准的.NET异常处理.他提出的解决方案变得更加优雅,因为.NET FW的后续版本改进了事件的处理方式.AppDomain.UnhandledException
AppDomain.UnhandledException