当前位置: 首页 > 编程语言 > C#

C#异常只在调试时捕获?分享

时间:2023-04-11 01:44:35 C#

C#异常只在调试时捕获?可能重复:发布模式下的异常处理问题我怀疑对此有一个非常简单的解释,但我似乎找不到它。当我的WinFormsC#4.0应用程序在Program.cs文件中加载自身时,在整个Main()函数中有一个try/catch语句。我写了一个小的异常包装器,它的行为与vanilla.net的“未捕获异常”框非常相似,除了它提供了更多信息,允许保存(序列化)异常树,并允许用户提交错误并直接向我报告.现在它在调试时工作正常(F5)。如果我在主线程中的程序中的任何位置触发异常,而没有try/catch,则异常会一直触发到Main()并显示自定义窗口。(我已经考虑并妥善处理的所有其他异常)。当我只运行.exe文件来运行程序时,会出现普通的.netexception框,而不是我编写的那个框。我有什么理由可以想到为什么会发生这种情况?最奇怪的是,它在调试模式下运行时的行为与单独运行时完全不同。我正在为调试而不是发布而构建。编辑(3月22日至11日):我只是在这里添加一个小的附录,以防你们中的一些人无法在下面接受的答案的评论中找到答案:忘记我说过我正在构建调试而不是发布。没关系-我只是添加它以获取额外信息。重要的是,当我在VS中调试ging时,会按预期捕获异常,但在VS外部执行我的EXE时,它们不会。正如Cody所说,Application.Run()有自己的异常处理程序,这就是为什么它们永远不会到达我的主要捕获点,但我提到我什至没有使用Application.Run()而不是我的GUI首先使用Form.ShowDialog().我做了一些实验,可以确认Form.ShowDialog()的行为与Application.Run()相同,因为异常是在方法本身内处理的。这是预期的行为。您看到的差异是应用程序在附加调试器的情况下运行的结果。当您从VisualStudio启动它时,调试器会自动附加(当然,除非您选择“不调试启动”)。这将禁用负责向您显示“vanilla”.NET异常对话框的内置异常处理程序。从VS外部启动它不会附加调试器,启用内置异常处理。(请注意,这与在“调试”模式和“发布”模式下编译程序无关。)有关详细信息,请参阅此相关问题的已接受答案。我不认为VB.NET和C#之间的区别在这种情况下是相关的。正如答案所提到的,有一种方法可以禁用内置的异常处理程序。但在选择之前,我建议您重新考虑您的方法。您可能会考虑处理内置的AppDomain.UnhandledException事件,而不是将整个Main方法包装在try-catch块中,这听起来有点代码味。JeffAtwood在CodeProject上有一篇很棒的文章,介绍了如何用您自己的用户友好方法替换标准.NET异常处理。他提出的解决方案变得更加优雅,因为.NETFW的更高版本改进了AppDomain.UnhandledException事件的处理。以上就是C#学习教程:C#异常只在调试时捕获?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: