[英]Why doesn't Visual Studio break on unhandled external exceptions?
[英]Visual Studio 2015 break on unhandled exceptions not working
Visual Studio曾经有一个特定的复选框“Break on Un-handling exception”。 在2015年,这已被删除(或移动到我找不到的地方)。 因此,如果我未能提供用户级异常处理程序,那么现在我的转换项目不再中断。 我不想打破所有“抛出异常”,因为我处理特定的异常。 就在我无法提供特定处理程序的地方。
现在我的代码只退出当前程序并继续在下一个调用堆栈位置执行,而不是好。
任何人都知道如何在Visual Studio 2015中获得此功能? 我昨天刚升级到社区版。
开始调试时,默认情况下会在右下方窗格中显示一个名为“异常设置”的新窗口。 它具有您期望的所有选项。
你可以使用CTRL + ALT + E来启动它
这允许您挑选哪些异常导致调试器中断。
但关键是,您还可以设置这些异常是否总是中断,或者只有当它是未处理的异常时才会中断 - 但设置这个异常并不是非常直观。
您需要先在工具>选项>调试下选中“启用我的代码”。
然后,您可以在新的“例外设置”窗口中右键单击列标题(“在投掷时中断”),然后添加“附加操作”列,然后允许您将每个例外设置为“在用户代码中未处理时继续”。
因此,只需右键单击异常或整个组,然后禁用“在用户代码中未处理时继续”标志。 不幸的是,“附加操作”列将显示为空,这与“在用户代码中未处理时中断”相同。
更多相关信息:
对于想要仅在异常涉及其代码时打破的googler,Visual Studio 2015中有一个选项:Options-> Debugging-> General-> Just My Code。 一旦检查,它允许在代码之外管理(抛出和捕获)异常时不中断。
微软巧妙地改变了新例外窗口中的逻辑。
关键部分是:
重要笔记
- 此新窗口包含与旧模式对话框相同的所有功能。 调试器的任何功能都没有仅改变您访问它们的方式
- 当未处理异常时,调试器将始终中断
- 如果调试器在用户未处理的异常中断,则更改的设置已在上下文菜单下移动
- 菜单位置已移至Debug - > Windows - > Exception Settings
但是 ,如果像我这样你的代码中有一个全局未处理的异常处理程序,那么该列表中的第二项是关键:对我来说,没有异常将因此真正未处理,这似乎与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!");
}
}
如果使用默认调试器设置运行此程序(仅在未处理的异常上停止),则调试器不会中断。 这是因为分配给continuation的线程池线程吞下了异常(将其传递给Task实例)并将自身释放回池中。
请注意,在这种情况下,真正的问题是从不检查Test()
返回的Task
。 如果你的代码中存在类似类型的“即发即忘”逻辑,那么在抛出它们时你就不会看到异常(即使它们在方法中是“未处理的”); 只有在您通过等待任务来查看任务,检查其结果或明确查看其异常时,才会显示该异常。
这只是一个猜测,但我认为你可能正在观察这样的事情。
根据我的经验,如果您更改任何内容,2015年的异常设置将完全失控。
期望如果你直到父组“CLR”那么你不应该得到任何未处理的破解执行。 如果未处理异常,您将始终中断。 但是,如果你没有取消CLR组,那么try ... catch中的代码应该不会导致中断。 事实并非如此。
解决方案:在新的例外设置工具箱中,右键单击并选择“恢复默认值”。 Taadaaaa ......它再次表现正常。 现在不要搞砸了。
请尝试按照说明操作:
当我升级到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
时Throw New Exception
。 因此,我们需要在新的异常设置中检查“System.Exception”标记:
检查后,我们的代码按预期执行。
Visual Studio中肯定存在一些错误,可能导致它被卡住而需要重启。 甚至VS2015。
我有一个单线程的情况, NullReferenceException
被一个'外部'处理程序(仍然在我的代码中)捕获,即使我要求它在它被引发时中断。
我意识到这是一个'处理'异常而你正在谈论一个'未处理的' - 但是我很确定有时快速重启VS会解决这个问题,如果IISRESET没有。
Visual Studio 2017可以正常处理错误。 另一方面,Visual Studio 2015对任务的错误处理很糟糕,因为在调试模式下,异步任务中发生的所有异常都会被捕获,但如果我跳过它就会无限期挂起。 如果在没有调试的情况下执行它会无限期挂起,没有异常被抓住! 我喜欢视觉工作室,自1995年以来一直在使用它,2015年是最糟糕的版本,虽然我从2010年直接跳到2015年。我花了8个小时试图让这个异常处理工作没有成功。 我在家用电脑上将确切的代码复制到了2017年,效果很好。 微软将任务推入2015编译器无法正确处理的框架中,我感到非常恼火。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.