Visual Studio 2015打破未处理的异常无效

Ted*_*ery 114 c# exception-handling unhandled-exception visual-studio-2015

Visual Studio曾经有一个特定的复选框"Break on Un-handling exception".在2015年,这已被删除(或移动到我找不到的地方).因此,如果我未能提供用户级异常处理程序,那么现在我的转换项目不再中断.我不想打破所有"抛出异常",因为我处理特定的异常.就在我无法提供特定处理程序的地方.

现在我的代码只退出当前程序并继续在下一个调用堆栈位置执行,而不是好.

任何人都知道如何在Visual Studio 2015中获得此功能?我昨天刚升级到社区版.

Tom*_*dee 117

开始调试时,默认情况下会在右下方窗格中显示一个名为"异常设置"的新窗口.它具有您期望的所有选项.

你可以用CTRL+ ALT+ 来提起它E

这允许您挑选哪些异常导致调试器中断.

但关键是,您还可以设置这些异常是否总是中断,或者只有当它是未处理的异常时才会中断 - 但设置这个异常并不是非常直观.

您需要先在工具>选项>调试下选中"启用我的代码".

然后,您可以在新的"例外设置"窗口中右键单击列标题("在投掷时中断"),然后添加"附加操作"列,然后允许您将每个例外设置为"在用户代码中未处理时继续".

因此,只需右键单击异常或整个组,然后禁用"在用户代码中未处理时继续"标志.不幸的是,"附加操作"列将显示为空,这与"在用户代码中未处理时中断"相同.

在此输入图像描述

更多相关信息:

http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx

  • @TomStudee我也有同样的问题.我想要的是"未经处理时打破",但我得到的是"扔掉时打破".问题是:如何获得"未处理时休息"? (18认同)
  • 这就是问题所在.它不会破裂.如上所述,它退出(步出)当前过程调用,并开始执行调用过程中的下一行代码. (17认同)
  • 实际上,该窗口只有"打破抛出"的选项.那不是我想要的.我想要"未经处理时休息". (7认同)
  • 我启用了"Just My Code". (2认同)

Jus*_* XL 36

我有同样的问题,我设法解决这个问题 -

  1. Ctrl+ Alt+ e打开" 异常设置"窗口.
  2. 勾选公共语言运行时例外. 在此输入图像描述

而已!

我的灵感来自这个职位,因为我使用的Windows版本的x64.

  • 这将导致它在所有异常中断,甚至是由用户代码处理的异常. (7认同)
  • @JustinXL问题是,这是一个异常类型的列表,而不是它是否被处理.例如,有时会处理`System.ArgumentException`,而有时则不处理.我只关心在没有*处理时打破. (6认同)
  • @JeradRose **当未处理异常时,调试器总是会中断。**所以就像我说的,如果您不想在已处理的异常上中断,只需从 **Break When Thrown** 列表中取消选中该异常类型即可。 (2认同)

Oli*_*yre 10

对于想要仅在异常涉及其代码时打破的googler,Visual Studio 2015中有一个选项:Options-> Debugging-> General-> Just My Code.一旦检查,它允许在代码之外管理(抛出和捕获)异常时不中断.


Off*_*oes 9

微软巧妙地改变了新例外窗口中的逻辑.

http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx

关键部分是:

重要笔记

  • 此新窗口包含与旧模式对话框相同的所有功能.调试器的任何功能都没有仅改变您访问它们的方式
  • 当未处理异常时,调试器将始终中断
  • 如果调试器在用户未处理的异常中断,则更改的设置已在上下文菜单下移动
  • 菜单位置已移至Debug - > Windows - > Exception Settings

但是,如果像我一样,你的代码中有一个全局未处理的异常处理程序,那么该列表中的第二项是关键:对我来说,没有异常将因此真正未处理,这似乎与VS2013不同.

为了回到VS打破未处理的异常的行为,我必须勾选我想要打破的所有异常类型,然后确保"其他选项"(您可能需要使此列可见*)"继续未处理的,当用户代码"是成立.VS2015逻辑似乎并不认为我的全局未处理异常处理程序是"在用户代码中处理",所以它确实打破了这些; 尽管如此,它并没有打破被捕获的异常.这使它像VS2013一样工作.

*如何启用"其他操作"列 *如何启用

  • 这与VS2013不完全相同,因为它会破坏用户处理的异常并使用您建议的设置,这在过去并非如此. (2认同)

Dan*_*ant 7

如果我在这里的行之间正确读取,问题是你的异常实际上正在"消失",即使默认的调试器行为应该在未处理的异常上中断.

如果您有异步方法,则可能遇到此问题,因为作为任务延续的一部分未在线程池线程上捕获的异常不被视为未处理的异常.相反,它们被吞噬并与任务一起存储.

例如,看看这段代码:

class Program
{
    static void Main(string[] args)
    {
        Test();
        Console.ReadLine();
    }

    private async static Task Test()
    {
        await Task.Delay(100);
        throw new Exception("Exception!");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果使用默认调试器设置运行此程序(仅在未处理的异常上停止),则调试器不会中断.这是因为分配给continuation的线程池线程吞下了异常(将其传递给Task实例)并将自身释放回池中.

请注意,在这种情况下,真正的问题是永远不会检查Task返回的Test().如果你的代码中存在类似类型的"即发即忘"逻辑,那么在抛出它们时你就不会看到异常(即使它们在方法中是"未处理的"); 只有在您通过等待任务来查看任务,检查其结果或明确查看其异常时,才会显示该异常.

这只是一个猜测,但我认为你可能正在观察这样的事情.