Visual Studio 曾经有一个特定的复选框来“中断未处理的异常”。在 2015 年,这已被删除(或移动到我找不到的地方)。因此,如果我未能提供用户级异常处理程序,现在我转换的项目不再中断。我不想打破所有“抛出的异常”,因为我处理特定的异常。就在我未能提供特定处理程序的地方。
现在我的代码只是退出当前过程并在下一个调用堆栈位置继续执行,不好。
任何人都知道如何在 Visual Studio 2015 中恢复它?我昨天刚升级到社区版。
Tool
或 Window
选项卡没有所有需要的位置,Visual Studio 2015 将保留以前版本的当前布局。在您的情况下,您正在寻找 Exception Settings。
开始调试时,默认情况下,右下方窗格中会出现一个名为“异常设置”的新窗口。它具有您期望的所有选项。
您可以使用 CTRL+ALT+E 调出它
这允许您挑选哪些异常会导致调试器中断。
不过,关键是您还可以设置这些异常是否总是中断,或者仅在它是未处理的异常时才中断——但是设置这个不是很直观。
您需要首先检查工具 > 选项 > 调试下的“仅启用我的代码”。
然后,您可以在新的异常设置窗口中右键单击列标题(抛出时中断),并添加“附加操作”列,然后您可以将每个异常设置为“在用户代码中未处理时继续”。
因此,只需右键单击异常或整个组并禁用“在用户代码中未处理时继续”标志。不幸的是,“附加操作”列将显示为空,这与“在用户代码中未处理时中断”相同。
https://i.stack.imgur.com/ltXUq.png
更多关于这里:
我有同样的问题,我设法通过这样做来解决这个问题 -
按 Ctrl + Alt + e 调出异常设置窗口。勾选公共语言运行时异常。
而已!
由于我使用的是 x64 版本的 Windows,因此我受到了这个 post 的启发。
System.ArgumentException
,有时则不会。我只关心在 not 处理时打破它。
对于只想在异常涉及其代码时中断的 googler,Visual Studio 2015 中有一个选项:选项->调试->常规->仅我的代码。一旦检查,当异常在您的代码之外被管理(抛出和捕获)时,它允许不中断。
微软已经巧妙地改变了新例外窗口中的逻辑。
关键部分是:
重要说明 这个新窗口包含与旧模式对话框相同的所有功能。调试器的任何功能仅更改了您访问它们的方式 未处理异常时调试器将始终中断 如果调试器因用户未处理的异常中断而更改的设置已移至上下文菜单下 菜单位置已移至“调试” -> Windows -> 异常设置
但是,如果像我一样,您的代码中有一个全局未处理异常处理程序,那么该列表中的第二项是关键:对我来说,因此不会有任何异常是真正未处理的,这似乎与 VS2013 不同。
为了恢复 VS 在未处理的异常上中断的行为,我必须勾选我想要中断的所有异常类型,然后确保“其他选项”(您可能需要使该列可见*)为“继续”在用户代码中未处理时”未设置。 VS2015 逻辑似乎不认为我的全局未处理异常处理程序是“在用户代码中处理的”,所以它确实打破了这些;但它不会因捕获的异常而中断。这使它像 VS2013 一样工作。
https://i.stack.imgur.com/AjN3W.png
如果我在这里的两行之间正确阅读,问题是您的异常实际上是“消失”,即使默认调试器行为应该在未处理的异常上中断。
如果您有异步方法,您可能会遇到此问题,因为作为任务延续的一部分未在线程池线程上捕获的异常不被视为未处理的异常。相反,它们被吞下并与任务一起存储。
例如,看一下这段代码:
class Program
{
static void Main(string[] args)
{
Test();
Console.ReadLine();
}
private async static Task Test()
{
await Task.Delay(100);
throw new Exception("Exception!");
}
}
如果您使用默认调试器设置运行此程序(仅在未处理的异常上停止),调试器将不会中断。这是因为分配给延续的线程池线程吞下了异常(将其传递给 Task 实例)并将自身释放回池中。
请注意,在这种情况下,真正的问题是从未检查 Test()
返回的 Task
。如果您的代码中有类似类型的“即发即弃”逻辑,那么在抛出异常时您将看不到异常(即使它们在方法内“未处理”);只有当您通过等待任务、检查其结果或明确查看其异常来观察任务时,才会出现异常。
这只是一个猜测,但我认为你很可能正在观察这样的事情。
Debugger.Break()
调用。或者,您可以在 TaskScheduler.UnobservedTaskException
处理程序中添加显式 Debugger.Break()
,尽管这里的缺点是它可能会比原始异常更晚触发,因为它会在清理任务时在终结器线程上发生。一般来说,您应该努力始终观察任务结果,或者至少在失败时记录一个 try-catch 块。
根据我的经验,如果您更改任何内容,2015 年的异常设置就会完全失控。
期望如果您直到父组“CLR”,那么您不应该因为未处理而获得任何破坏性的执行。如果异常未处理,您将始终中断。但是,如果您未勾选 CLR 组,则 try...catch 中的代码根本不应该导致中断。事实并非如此。
解决方法:在新建的异常设置工具箱中,右键选择“恢复默认”。 Taadaaaa...它再次正常运行。现在不要搞砸了。
尝试按照说明操作:
在 Exception Settings 窗口中,通过右键单击窗口然后选择 Show Columns 打开上下文菜单。 (如果您关闭了 Just My Code,您将看不到此命令。)您应该会看到名为 Additional Actions 的第二列。此列在特定异常上显示用户代码未处理时继续,这意味着如果该异常未在用户代码中处理但在外部代码中处理,则调试器不会中断。您可以为特定异常(选择异常、右键单击并选择/取消选择在用户代码中未处理时继续)或整个异常类别(例如,所有公共语言运行时异常)更改此设置。
https://msdn.microsoft.com/en-us/library/x85tt0dd.aspx
try { task.Wait(); } catch { ... }
),并且任务中的 OperationCanceledException 在用户代码中被认为是未处理的。
这有点令人困惑,在我看来不如旧的异常对话框好,但无论如何。
如果异常在列表中并且被勾选,那么只要抛出异常,调试器就会中断。
如果异常未勾选或不在列表中,则调试器仅在该异常类型为用户未处理时才会中断。
例如,在下面的屏幕截图中,只要抛出 System.AccessViolationException
,调试器就会中断,但对于所有其他异常,只有在用户未处理异常时才会中断。
https://i.stack.imgur.com/f1tz3.png
当我升级到 VS2015 时,我也遇到了异常用于“破坏”应用程序的问题,但现在被忽略并直接忽略了。有时我们希望我们的代码有意在我们希望代码停止而不是继续的地方抛出异常。我们总是使用短语 Throw New Exception("Message")
来故意破坏我们的代码:
If SomethingReallyBad = True Then
Throw New Exception("Something Really Bad happened and we cannot continue.")
End If
在 VS2015 中,当我们说 Throw New Exception
时会抛出经典的“System.Exception”。因此,我们需要在新的异常设置中勾选“System.Exception”:
Check the System.Exception Box
检查后,我们的代码按预期运行。
解决方案是在语义上与您认为您正在设置的相反。您需要确保未启用在用户代码中未处理时继续,即未选中,如“异常设置”选项卡中的“附加操作”列下所示 - 见下文:
您实际上是在说在代码中未处理时不要继续(即中断)
https://i.stack.imgur.com/6bJTo.png
去做这个:
右键单击您关心的异常或一组异常(即通常在树中的顶行“公共语言运行时异常”)选择选项在用户代码中未处理时继续(见下文)确保未检查异常(见下面)继续调试
https://i.stack.imgur.com/ICLuz.png
那为我做到了——又开心了。
这是在 VS 2015 中
Visual Studio 中肯定存在一些错误,可能会导致它卡住,需要重新启动。甚至VS2015。
我有一个单线程情况,其中 NullReferenceException
被“外部”处理程序(仍在我的代码中)捕获,即使我要求它在引发时中断。
我意识到这是一个“已处理”异常,而您说的是“未处理”异常-但是我很确定,如果 IISRESET 没有,有时快速重启 VS 会解决此问题。
Visual Studio 2017 可以很好地处理错误。另一方面,Visual Studio 2015 不擅长处理任务的错误,因为在调试模式下,异步任务中发生的所有异常都会被捕获,但是如果我越过它,它就会无限期地挂起。如果在没有调试的情况下执行,它会无限期挂起,没有捕获到异常!!!我喜欢 Visual Studio,并且自 1995 年以来一直在使用它,尽管我从 2010 年直接跳到 2015 年,但 2015 年是迄今为止最差的版本。我花了 8 个小时试图让这个异常处理工作没有成功。我在家用电脑上将确切的代码复制到 2017 年,它运行良好。我对微软将任务推入一个 2015 编译器无法正确处理的框架感到非常恼火。