Visual Studio:如何打破处理的异常?


165

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

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

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

我遇到了有关Visual Studio.NET的这些说明:

1)在VS.NET中,转到“调试”菜单>>“异常...” >>“公共语言运行时异常” >>“系统”,然后选择“ System.NullReferenceException”

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

3)运行您的方案。当引发异常时,调试器将停止并通过一个类似以下对话框的对话框通知您:“已引发类型为“ System.NullReferenceException”的异常。[中断] [继续]“

点击[Break]。这将使您进入引起问题的代码行。

但是它们不适用于Visual Studio 2005(“ 调试”菜单上没有“ 例外”选项)。

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

更新:问题是我的“ 调试”菜单没有“ 例外”项。我自定义菜单以手动添加它。


9
在VS2015中,它位于“调试”
PeterVermont

我花了一段时间才能找到如何恢复默认后,我改变了一些例外的设置,因此新的答案例外设置。将例外设置恢复为默认设置
Mabito

Answers:


170

打开解决方案后,转到“调试-例外(Ctrl+ DE)”菜单选项。在这里,您可以选择中断引发的用户未处理的异常。

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


10
我只是没有这样的选择。那可以解释我的困惑。
伊恩·博伊德

58
我有调试菜单,但没有例外选项。我自定义菜单以手动添加它;快捷键以任何一种方式起作用(Ctrl + Alt + E)
Ian Boyd

3
另外,您还可以通过以下方法重置VS2010环境:转到“工具”,“导入导出设置”,然后选择重置为C#环境...它包含“例外”子菜单项
BeardinaSuit 2012年

14
我在Visual Studio 2017下选择了Common Language Runtime Exceptions> <All Common Language Runtime Exceptions not in this list>,所有我最疯狂的梦想都实现了。
亚伦牛顿

9
Visual Studio的2015年:调试- >窗口- >例外设置
achecopar

47

VS2005中有一个“例外”窗口... 调试时尝试Ctrl+ Alt+ E,然后单击“引发”复选框以获取要停止的例外。


那正是我想要的。菜单在哪里?对于我的一生,我找不到它。
伊恩·博伊德

键盘快捷方式可以根据配置文件(C#开发人员,C ++开发人员等)进行更改
Asaf R

1
我有一个菜单项:调试->异常。这是VS2005 Professional。您正在运行Express版本吗?
Rob Walker

5
如果需要“例外”菜单项,请选择:自定义...。单击“命令”选项卡。在类别框中选择调试类别。找到“例外...”命令项,然后将其拖到应用程序顶部的“调试”菜单中,并将其放在菜单中的适当位置。(在评论中发现blogs.vertigo.com/personal/keithc/Blog/archive/2007/07/20/...
猝倒

33

花了我一段时间寻找期望设置的新地方,因此有了新的答案。

从Visual Studio 2015开始,您可以在“异常设置”窗口(调试-> Windows->异常设置)中控制停止哪些异常。快捷方式仍然是Ctrl- - 。AltE

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

这是英文版的屏幕截图:

在此处输入图片说明

这是德语版的屏幕截图:

在此处输入图片说明


16

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

步骤1 第1步 步骤2 第2步


8

在“调试器”页面上选中“ 管理异常”,其中说明了如何进行设置。

本质上,这是步骤(调试过程中):

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

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

    -要么-

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


1

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

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

我发现这为我提供了更多的测试灵活性,因为仍然有一些我不希望IDE中断的异常。


3
这是一种有用的技术-将已处理的异常转换为未处理的异常,因此调试器会自动在其上停止。我不知道为什么不推荐它,除非那不是设置GlobalTestingBool的好方法。另一个可能更好的选择是使用Debugger.IsAttached。
乔·怀特

您必须在每次try / catch周围添加此代码,然后重新编译代码。如果您已经在调试某些东西,则不是很有用。
Max

如果存在特殊情况(某些情况是不可接受的),则应在代码中引发异常,并且应在可以决定如何处理该异常的级别上捕获该异常。这样的代码使执行路径变得复杂。
李·奥德斯

我知道这确实是个老答案,但是对于像我这样的随机Google员工,您可以添加catch(){/*handle or not*/ throw; } // throw without any exception specified will rethrow original exception with original callstack etc
Jan'splite'K.

0

在线文档似乎还不清楚,因此我进行了一些测试。从“异常”对话框中选择“在引发时中断”会导致程序在发生任何已处理或未处理的异常时中断执行。如果只想中断处理的异常,似乎唯一的办法就是遍历代码并将断点放在所有处理的异常上。这似乎有点多余,所以在处理异常时最好添加一条调试语句。然后,当看到该输出时,可以在代码中的该行设置一个断点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.