如何使在简单的测试用例中隐藏调试器的exception?

建立:

1)MSVS 2015,选项 – >调试器 – >“仅我的代码”被选中。

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()中停止,即使在该范围内不应该处理exception。

在此处输入图像描述

4)也使用[DebuggerHidden]重新尝试,结果相同。

动机:

动机是针对某些不受控制的API不提供“尝试”方法而仅通过使用exception表示失败的情况。

众多此类示例中的一个是.NET TcpClient.Connect(主机,端口)。 假设一个程序总是在启动期间测试一些连接,调试器不应该每次都停在这个特定的代码段上。

使用标准的“抛出时中断”exception复选框并不好,因为它按类型全局工作。 它无法配置为在本地工作。 检查代码的其他开发人员也应自动跳过该exception。

谜团已揭开。 由于添加了exception处理优化,这确实是MSVS 2015中的一个新问题。

https://blogs.msdn.microsoft.com/visualstudioalm/2016/02/12/using-the-debuggernonusercode-attribute-in-visual-studio-2015/#

在该链接上发布了一个解决方法,用于禁用优化并启用旧行为。 希望他们最终能够重振对此的支持,包括优化。

 reg add HKCU\Software\Microsoft\VisualStudio\14.0_Config\Debugger\Engine /v AlwaysEnableExceptionCallbacksOutsideMyCode /t REG_DWORD /d 1 

相关问题:

当它被抛出并被捕获时,不要停止调试器