【问题标题】:Visual Studio 2015 unexpectedly breaking on handled exceptionsVisual Studio 2015 意外中断处理的异常
【发布时间】:2017-01-27 06:39:58
【问题描述】:
一个图像值得很多话,以下怎么可能:
可以看出,Visual Studio 2015(最新版本)在 Exception Settings 下的 Common Language Runtime Exceptions 未选中,Tools > Options > Debugging 下的 Enable Just My Code 被选中时中断,并且清楚地处理了异常(在 try/catch 块内)。
线路失败并导致中断是对外部 API 的调用(这有点错误,因此是 try/catch 块)。
我是否遗漏了一些可以证明休息的东西,或者这是一个错误?我认为this other question 会提供一些见解,但不幸的是它在这里没有帮助(异常已处理,因此我们不需要启用额外的Continue When Unhandled in User Code 选项。
【问题讨论】:
标签:
c#
exception
visual-studio-2015
exception-handling
break
【解决方案1】:
这个异常有一个特殊情况,我猜这里也适用。来自docs:
AccessViolationException 和 try/catch 块
从 .NET Framework 4 开始,如果异常发生在公共语言运行时保留的内存之外,则公共语言运行时引发的 AccessViolationException 异常不会由结构化异常处理程序中的 catch 语句处理。要处理此类 AccessViolationException 异常,您应该将 HandleProcessCorruptedStateExceptionsAttribute 属性应用于引发异常的方法。此更改不会影响用户代码抛出的 AccessViolationException 异常,这些异常可以继续被 catch 语句捕获。对于为以前版本的 .NET Framework 编写的代码,您希望在 .NET Framework 4 上重新编译和运行而不进行修改,您可以将元素添加到应用的配置文件中。请注意,如果您为 AppDomain.FirstChanceException 或 AppDomain.UnhandledException 事件定义了处理程序,您也可以收到异常通知。
正如文档所说,解决方案是将HandleProcessCorruptedStateExceptionsAttribute 添加到Start() 方法中。如果不可能(例如,这是通过库提供的),我猜您可以添加一个包装调用的方法并将属性添加到该包装方法。