Visual Studio以前有一个特定的复选框用于“在未处理的异常时中断”。在2015年,它已被删除(或移到了我找不到的地方)。因此,如果我未能提供用户级异常处理程序,那么现在转换后的项目将不再中断。我不想破坏所有“抛出的异常”,因为我处理特定的异常。只是在我无法提供特定处理程序的地方。
现在,我的代码只是退出当前过程,并在下一个调用堆栈位置继续执行,而不是良好。
有人知道如何在Visual Studio 2015中重新获得它吗?我昨天刚升级到社区版。
Visual Studio以前有一个特定的复选框用于“在未处理的异常时中断”。在2015年,它已被删除(或移到了我找不到的地方)。因此,如果我未能提供用户级异常处理程序,那么现在转换后的项目将不再中断。我不想破坏所有“抛出的异常”,因为我处理特定的异常。只是在我无法提供特定处理程序的地方。
现在,我的代码只是退出当前过程,并在下一个调用堆栈位置继续执行,而不是良好。
有人知道如何在Visual Studio 2015中重新获得它吗?我昨天刚升级到社区版。
Answers:
开始调试时,默认情况下会在右下方窗格中显示一个名为“异常设置”的新窗口。它具有您期望的所有选项。
您可以使用CTRL+ ALT+E
这使您可以选择哪些异常导致调试器中断。
但是,关键在于,您还可以设置这些异常是始终中断还是仅在它是未处理的异常时才中断-但设置该字段不是很直观。
您需要首先在工具>选项>调试下选中“仅启用我的代码”。
然后,您可以在新的“例外设置”窗口中右键单击列标题(“抛出时中断”),并添加“其他操作”列,然后将每个例外设置为“在用户代码中未处理时继续”。
因此,只需右键单击异常或整个组,然后禁用“在未处理用户代码时继续”标志。不幸的是,“其他操作”列将显示为空,与“在用户代码中未处理时中断”相同。
有关此的更多信息:
System.ArgumentException
被处理,有时会被处理。我只关心在不处理时中断。
对于只希望在异常涉及其代码时才中断的Googler,Visual Studio 2015中提供了一个选项:选项->调试->常规->我的代码。一旦检查,它允许在代码之外管理(抛出和捕获)异常时不中断。
Microsoft在新的“例外”窗口中巧妙地更改了逻辑。
关键部分是:
重要笔记
- 这个新窗口包含与旧模式对话框相同的功能。调试器的功能仅更改了您访问它们的方式,就没有改变
- 当未处理异常时,调试器将始终中断
- 如果调试器因用户未处理的异常而中断,则更改的设置已移至上下文菜单下
- 菜单位置已移至“调试”->“ Windows”->“例外设置”
但是,如果像我一样,您的代码中有一个全局未处理的异常处理程序,那么该列表上的第二项是关键:对我而言,因此不会真正处理任何异常,这似乎与VS2013不同。
要恢复VS在未处理的异常上中断的行为,我必须勾选要中断的所有异常类型,然后确保“继续”的“附加选项”(您可能需要使该列可见*)在用户代码未处理时”被不设定。VS2015逻辑似乎不认为我的全局未处理异常处理程序是“在用户代码中处理的”,因此它确实在这些代码上中断了;它不会中断捕获到的异常。这使其像VS2013一样工作。
如果我在这里正确地阅读了两行之间的问题,那么问题是即使默认调试器行为应在未处理的异常上中断,您的异常也实际上“消失了”。
如果您具有异步方法,则可能会遇到此问题,因为作为任务延续的一部分未在线程池线程上捕获的异常不被视为未处理的异常。而是将它们吞下并与任务一起存储。
例如,看下面的代码:
class Program
{
static void Main(string[] args)
{
Test();
Console.ReadLine();
}
private async static Task Test()
{
await Task.Delay(100);
throw new Exception("Exception!");
}
}
如果使用默认调试器设置运行该程序(仅在未处理的异常时停止),调试器将不会中断。这是因为分配给延续的线程池线程吞下了异常(将其传递给Task实例)并将其释放回该池。
请注意,在这种情况下,真正的问题是,从不检查Task
return by Test()
。如果您的代码中有类似类型的“一劳永逸”逻辑,那么在抛出异常时就不会看到它们(即使方法内部未处理)。仅当您通过等待任务,检查其结果或显式查看其异常来观察任务时,才会显示该异常。
这只是一个猜测,但我认为您可能正在观察这样的情况。
Debugger.Break()
调用。或者,您可以Debugger.Break()
在TaskScheduler.UnobservedTaskException
处理程序中添加一个显式控件,尽管这样做的缺点是,它可以比原始异常触发得晚得多,因为它在清理Task时在终结器线程上发生。通常,您应该努力始终观察Task的结果,或者至少在失败时记录一个try-catch块。
尝试按照说明进行操作:
try { task.Wait(); } catch { ... }
),该任务中的OperationCanceledException被认为在用户代码中未处理。
当我升级到VS2015时,我还遇到了一些问题,这些异常曾经用来“破坏”应用程序,但现在被忽略并直接传递。有时候,我们希望代码在我们希望代码停止而不是继续的地方故意抛出异常。我们总是使用该短语Throw New Exception("Message")
来使我们的代码有意中断:
If SomethingReallyBad = True Then
Throw New Exception("Something Really Bad happened and we cannot continue.")
End If
在VS2015中,当我们说时会抛出经典的“ System.Exception” Throw New Exception
。因此,我们需要在新的“例外设置”中检查“ System.Exception”对勾:
检查后,我们的代码按预期进行。
Visual Studio 2017可以很好地处理错误。另一方面,Visual Studio 2015会沉迷于任务的错误处理,因为在调试模式下,异步任务中发生的所有异常都会被捕获,但是如果我跳过它,则会无限期地挂起。如果在没有调试的情况下执行,它将无限期地挂起,没有异常捕获!!!我喜欢Visual Studio,自1995年以来一直使用它,而2015年是最差的版本,尽管我从2010年直接跳到2015年。我花了8个小时试图使这种异常处理无法成功。我在家用计算机上将确切的代码复制到2017年,并且运行良好。我非常恼怒的是,Microsoft将任务推入了2015编译器无法正确处理的框架。
Tool
或Window
选项卡不具有所有所需的位置。在您的情况下,您正在寻找“ 例外设置”。