设置:
1) MSVS 2015,选项-> Debugger -> "Just My Code“被选中。
2)此示例代码放置在某个类中,并在启动期间调用:
static bool TestIgnoreException()
{
Exception ex;
return TrySomething(out ex);
}
[DebuggerNonUserCode] // Prevent exceptions from stopping the debugger within this method.
static bool TrySomething(out Exception exOut)
{
try
{
if (Environment. MachineName.Length != -1)
throw new Exception("ThrewIt.");
exOut = null;
return true;
}
catch (Exception ex)
{
exOut = ex;
return false;
}
}
3)发射调试器
预期结果是TestIgnoreException()以静默方式运行并返回false。
实际结果是调试器在TestIgnoreException()中停止,即使在该范围内不应该处理异常。
4)再次尝试用DebuggerHidden代替,结果相同。
动机:
其动机是,某些超出您控制范围的API没有提供“尝试”方法,而只是通过使用异常来指示失败。
众多这样的例子之一就是.NET TcpClient.Connect(主机、端口)。假设程序在启动时总是测试一些连接,调试器不应该每次都停止在这段代码上。
使用标准的“抛出时中断”异常复选框是不好的,因为它按类型在全局工作。不能将其配置为在本地工作。另外,其他签出代码的开发人员也应该自动跳过异常。
发布于 2016-09-09 00:05:37
谜团解开了。由于增加了异常处理优化,这确实是MSVS 2015中的一个已知问题。
在该链接上发布了一个解决方案,用于禁用优化并启用旧行为。希望他们最终能够恢复对此的支持,包括优化。
reg add HKCU\Software\Microsoft\VisualStudio\14.0_Config\Debugger\Engine /v AlwaysEnableExceptionCallbacksOutsideMyCode /t REG_DWORD /d 1
有关问题:
Don't stop debugger at THAT exception when it's thrown and caught
https://stackoverflow.com/questions/39382551
复制相似问题