【发布时间】:2011-02-25 04:52:10
【问题描述】:
我怀疑对此有一个非常简单的解释,但我似乎找不到。
当我的 WinForms C# 4.0 应用程序将自身加载到 Program.cs 文件中时,整个 Main() 函数内部都有一条 try/catch 语句。
我写了一个小异常包装器,它的行为与 vanilla .net “未捕获异常”框非常相似,除了它提供了更多信息,允许保存(序列化)异常树,它允许用户直接将错误报告提交给我。
现在,它在调试 (F5) 时工作正常。如果我在主线程中的程序中触发异常 anywhere,如果没有 try/catch,则异常会一直触发到 Main() 并显示自定义窗口。
(所有其他我已考虑并得到适当处理的例外情况)。
当我简单地通过运行 .exe 文件来运行程序时,会出现 vanilla .net 异常框,而不是我编写的那个。
您有什么理由可以想到为什么会发生这种情况? 最奇怪的是,它在调试模式下运行与单独运行时的行为完全不同。 我正在构建调试 - 不是发布。
编辑(2011 年 3 月 22 日):
我只是在这里添加一个小附录,以防你们中的一些人在下面接受的答案中找不到隐藏在 cmets 中的答案: 忘记我说我是作为调试而不是发布来构建的。这无关紧要 - 我只是添加它以获得更多信息。重要的是,当我在 VS 中调试ging 时,异常会按预期捕获,但在 VS 之外执行我的 EXE 时却不会。
正如 Cody 所说,Application.Run() 有自己的异常处理程序,这就是为什么它们永远不会到达我的主要catch,但是我提到我什至没有在我的代码中的任何地方使用Application.Run()...而是我的GUI 首次使用Form.ShowDialog() 启动。
我做了一些实验,可以确认Form.ShowDialog() 的行为与Application.Run() 相同,因为异常是在方法本身内处理的。
【问题讨论】:
-
你确定它的处理程序代码不会生成“不漂亮”的异常框吗?
-
@Cody Gray,我能否与您确认一下:我的代码中的任何地方都没有调用
Application.Run。您将我标记为重复的线程以及您在此处对我的问题的回答都表示通用 .Net 错误框是由Application.Run的内部事件处理程序生成的。这似乎与我的源代码冲突。 (?) -
查看我对您对我的回答的评论的回答(哇,这有意义吗?)。如果是这种情况,这似乎不是“完全重复”,但我们无法知道这一点,因为您没有发布您的源代码。始终将代码的适用部分包含在问题中是一个好主意的原因。由于我们经常被要求进行心理调试,因此我们有时会比有时更相信自己的直觉。
标签: c# .net debugging exception exception-handling