【问题标题】:Visual Studio: How to break on handled exceptions?Visual Studio:如何中断处理的异常?
【发布时间】:2010-09-12 03:02:57
【问题描述】:

我希望 Visual Studio 在发生已处理的异常时中断(即,我不只是想看到“第一次机会”消息,我想调试实际的异常)。

例如我希望调试器在异常时中断:

try
{
   System.IO.File.Delete(someFilename);
}
catch (Exception)
{
   //we really don't care at runtime if the file couldn't be deleted
}

我遇到了these Visual Studio.NET 的注释:

1) 在 VS.NET 中转到调试菜单 >> “例外...” >> “通用语言 运行时异常”>>“系统”和 选择“System.NullReferenceException”

2) 在该对话框的底部 是一个“当抛出异常时:” 组框,选择“闯入 调试器”

3) 运行您的方案。当。。。的时候 抛出异常,调试器将 停止并通过对话框通知您 像这样说: ““System.NullReferenceException”类型的异常具有 被抛出。 [中断] [继续]"

点击[中断]。这会让你在 导致 问题。

但它们不适用于 Visual Studio 2005(Debug 菜单上没有 Exceptions 选项。

有谁知道在 Visual Studio 中找到此选项对话框的位置,即“抛出异常时”组框,带有“进入调试器的选项“?

更新:问题是我的 Debug 菜单没有 Exceptions 项。我自定义菜单以手动添加它。

【问题讨论】:

  • 在 VS2015 中是在 Debug->Windows->Exception Settings
  • 在我更改了一些异常设置后,我花了一段时间才找到如何恢复 默认异常设置,因此有了新的答案。 restore exception settings to default

标签: visual-studio exception debugging


【解决方案1】:

打开解决方案后,转到调试 - 异常 (Ctrl+D,E) 菜单选项。从那里您可以选择中断 Thrown用户未处理 异常。

编辑:我的实例是使用 C#“配置文件”设置的,也许其他配置文件不存在?

【讨论】:

  • 我只是没有这样的选择。这可以解释我的困惑。
  • 我有调试菜单,但没有例外选项。我自定义菜单以手动添加它;快捷键可以使用任何一种方式(Ctrl+Alt+E)
  • 另外,您可以重置 VS2010 环境,方法是转到“工具”、“导入导出设置”并选择重置为 C# 环境...它包含 Exceptions 子菜单项
  • 我在 Visual Studio 2017 下选择了Common Language Runtime Exceptions > <All Common Language Runtime Exceptions not in this list>,我所有最疯狂的梦想都实现了。
  • Visual Studio 2015:调试 -> Windows -> 异常设置
【解决方案2】:

VS2005 中有一个“异常”窗口...在调试时尝试 Ctrl+Alt+E 并单击“抛出” ' 要停止的异常的复选框。

【讨论】:

  • 这正是我想要的。那在菜单的什么地方?对于我的生活,我找不到它。
  • 键盘快捷键可以根据配置文件(C#开发者、C++开发者等)改变
  • 我有一个菜单项:调试 -> 异常。这是VS2005 Professional。您正在运行 Express 版本吗?
  • 如果您想要例外菜单项:选择工具 |自定义...。单击“命令”选项卡。在类别框中选择调试类别。找到 Exceptions... 命令项,然后将其拖到应用程序顶部的 Debug 菜单,将其放在菜单中的适当位置。 (在 cmets 中找到:blogs.vertigo.com/personal/keithc/Blog/archive/2007/07/20/…
【解决方案3】:

我花了一段时间才找到预期设置的新位置,因此找到了新答案。

自 Visual Studio 2015 起,您可以在异常设置窗口(调试->Windows->异常设置)中控制要停止的异常。快捷键还是Ctrl-Alt-E

处理自定义异常的最简单方法是选择“所有不在此列表中的异常”。

这是英文版的截图:

这是德语版的截图:

【讨论】:

    【解决方案4】:

    从 Visual Studio 2015 起,您需要转到“异常设置”对话框 (Ctrl+Alt+E) 和检查“公共语言运行时异常”(或您想要的特定异常,即ArgumentNullException),使其在已处理异常时中断。

    第 1 步 第2步

    【讨论】:

      【解决方案5】:

      查看Managing Exceptions with the Debugger 页面,它解释了如何设置。

      基本上,以下是步骤(在调试期间):

      1. 在“调试”菜单上,单击“例外”。

      2. 在“异常”对话框中,为整个异常类别选择“引发”,例如公共语言运行时异常。

        -或-

        为异常类别展开节点,例如公共语言运行时异常,然后为该类别中的特定异常选择抛出。

      【讨论】:

        【解决方案6】:

        我使用的技术类似于以下内容。根据您要调试的内容定义一个可用于一个或多个 try catch 块的全局变量,并使用以下结构:

        if(!GlobalTestingBool)
        {
           try
           {
              SomeErrorProneMethod();
           }
           catch (...)
           {
              // ... Error handling ...
           }
        }
        else
        {
           SomeErrorProneMethod();
        }
        

        我发现这在测试方面给了我更多的灵活性,因为仍然存在一些我不希望 IDE 中断的例外情况。

        【讨论】:

        • 这是一种有用的技术——它将已处理的异常转换为未处理的异常,因此调试器会自动停止。我不确定为什么它被否决了,除非它没有设置你的 GlobalTestingBool 的好方法。另一个可能更好的选择是使用 Debugger.IsAttached。
        • 你必须在每次 try/catch 中添加这个并重新编译你的代码。如果您已经在调试某些东西,这不是很有用。
        • 如果出现异常情况(不可接受的情况),则应在代码中引发异常,并且应在可以决定如何处理它的级别上捕获该异常。诸如此类的代码会使执行路径复杂化。
        • 我知道这是一个很老的答案,但对于像我这样的随机谷歌用户,您可以添加 catch(){/*handle or not*/ throw; } // throw without any exception specified will rethrow original exception with original callstack etc
        【解决方案7】:

        网上的文档好像有点不清楚,所以我只是做了一点测试。从“异常”对话框中选择“在抛出时中断”会导致程序执行在任何异常(已处理或未处理)时中断。如果您只想中断已处理的异常,您唯一的办法似乎是检查您的代码并在所有已处理的异常上放置断点。这似乎有点过分,因此在处理异常时添加调试语句可能会更好。然后,当您看到该输出时,您可以在代码中的该行设置断点。

        【讨论】:

          猜你喜欢
          • 2017-01-27
          • 1970-01-01
          • 1970-01-01
          • 2018-04-01
          • 1970-01-01
          • 2023-03-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多