Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#仅在调试时捕获异常?_C#_.net_Debugging_Exception_Exception Handling - Fatal编程技术网

C#仅在调试时捕获异常?

C#仅在调试时捕获异常?,c#,.net,debugging,exception,exception-handling,C#,.net,Debugging,Exception,Exception Handling,可能重复: 我怀疑有一个非常简单的解释,但我似乎找不到 当我的WinForms C#4.0应用程序在Program.cs文件中加载自己时,整个Main()函数中都有一个try/catch语句 我已经编写了一个小的异常包装器,其行为与vanilla.net“UncaughtException”框非常相似,只是它提供了更多的信息,允许保存(序列化)异常树,并且允许用户直接向我提交错误报告 现在,它在调试(F5)时工作正常。如果我在主线程中的程序中的任何位置触发异常,如果没有try/catch,则异

可能重复:

我怀疑有一个非常简单的解释,但我似乎找不到

当我的WinForms C#4.0应用程序在Program.cs文件中加载自己时,整个Main()函数中都有一个try/catch语句

我已经编写了一个小的异常包装器,其行为与vanilla.net“UncaughtException”框非常相似,只是它提供了更多的信息,允许保存(序列化)异常树,并且允许用户直接向我提交错误报告

现在,它在调试(F5)时工作正常。如果我在主线程中的程序中的任何位置触发异常,如果没有try/catch,则异常会一直激发回main(),并显示自定义窗口

(我已说明并妥善处理了所有其他例外情况)

当我仅仅通过运行.exe文件来运行程序时,会出现香草.net异常框,而不是我编写的异常框

你能想到为什么会发生这种情况吗? 最奇怪的是,它在调试模式下运行时的行为与单独运行时完全不同。 我将构建为调试-而不是发布

编辑(2011年3月22日):

我只是在这里添加了一个小附录,以防你们中的一些人在下面接受的答案的评论中找不到隐藏的答案: 忘了我说过我是作为调试而不是发布来构建的。这是没有关系的-我只是添加了额外的信息。重要的是,当我在VS中调试时,异常会按预期捕获,但当在VS外部执行EXE时,异常不会被捕获

正如Cody所说,
Application.Run()
有自己的异常处理程序,这就是为什么它们永远无法访问我的主
catch
,但是我提到我甚至没有在代码中的任何地方使用
Application.Run()
。。。相反,我的GUI首先是通过
Form.ShowDialog()
启动的


我做了一些实验,可以确认
Form.ShowDialog()
的行为与
Application.Run()
相同,因为异常是在方法本身内处理的。

这是预期的行为。

您看到的差异是应用程序运行时附加了调试器的结果。当您从VisualStudio中启动它时,调试器将自动附加(当然,除非您选择“不调试启动”)。这将禁用内置异常处理程序,该处理程序负责向您显示“vanilla.NET异常”对话框。从VS外部启动它不会附加调试器,使内置异常处理处于启用状态。(请注意,这与在“调试”模式和“发布”模式下编译程序无关。)

有关详细信息,请参阅。我不相信VB.NET和C#之间的区别在这种情况下是相关的


正如回答中提到的,有一种方法可以禁用内置异常处理程序。但在选择这样做之前,我建议重新考虑你的方法。而不是在一个TestCcatch块中包装完整的<代码>主< /COD>方法,您可以考虑处理内置的。杰夫·阿特伍德(Jeff Atwood)发表了一篇很棒的文章,介绍了如何用自己更为用户友好的方法取代标准的.NET异常处理。随着.NET FW的更高版本改进了AppDomain.UnhandledException事件的处理方式,他提出的解决方案变得更加优雅。

您确定是您的处理程序代码不会生成“unpartty”异常框吗?@Cody Gray,我可以和您确认一下:我没有调用
应用程序。请在我的代码中的任何地方运行
。您将我的线程标记为重复的线程,以及您在此处对我的问题的回答都表明,通用.Net错误框是由
应用程序.Run的内部事件处理程序生成的。这似乎与我的源代码冲突。(?)看看我对你对我的回答的回答(哇,有道理吗?)。如果是这样的话,这似乎不是一个“精确的副本”,但是我们没有任何方法知道这一点,因为您没有发布您的源代码。在问题中包含代码的适用部分始终是一个好主意的原因。因为我们经常被要求进行心理调试,所以我们有时比我们应该相信的更相信自己的直觉。我想你没有读到这个问题。@Kragen:为什么?也许是这样;你能澄清我误读了什么吗?我很乐意相应地修改/删除我的答案。@Cody在调试器中运行时,应用程序会显示一个自定义异常对话框,这表明没有完全未处理的异常,因此默认的异常处理程序永远不会出现。@Kragen:我也是这样看问题的。区别在于
应用程序.Run
方法中内置的异常处理程序是否已启用。在调试器下运行时,它被禁用,因此围绕
Main
方法的try-catch块正在处理异常。当您不在调试器下运行时,内置的异常处理将接管并显示对话框,直到异常从堆栈传递到
Main
方法的try-catch块。@Cody Ah-我没有注意到未处理的异常是在
应用程序内处理的。运行
,或者,如果附加了调试器,则此行为已完全禁用。出于某种原因,我一直认为未经处理的异常是由
应用程序.Run
引发的,尽管考虑到这一点,我意识到这是多么荒谬!