使用以下示例代码:(VS 2013,update 3)
dynamic demo = new ExpandoObject();
demo.Test = 10;
var j = demo.Test; // throws exception
调试此代码时,'异常时中断:'在VS中检查'Thrown''然后尝试访问现有属性'Test'会抛出{ {1}}:
System.Dynamic.ExpandoObject'不包含'Test'的定义
注意:单步转到下一行,变量j正确设置为10.
Q1:为什么抛出异常,当Test属性肯定存在并保持值10时,事实变量j成功设置了这个值?当我尝试使用一个非常不存在的属性名称(如Test2)时会发生完全相同的异常,但不同之处在于代码确实跳出了具有非处理异常的块...
抛出一个完全错误和误导性的异常,然后在内部处理它只是没有意义,除了它呈现VS'中断异常时:'Thrown'选项功能实际上不能用于使用动态对象的代码。
Q2:是的我知道取消选中可以隐藏此问题'当异常为:'Thrown'选项时中断。 然而,假设开发人员使用动态对象并试图在她/他的代码中查找与动态对象完全无关的异常,这不是一个选项,这个问题使得“当异常是:'抛出'选项无法使用,因为然后调试器将停止数千个正确的属性访问语句。有没有解决方法?
错过了什么?
提前致谢。
*编辑* 此编辑是在正确答案之后。
Damir在回答中问道:“为什么我的VS选项中禁用了启用我的代码?”好吧,这就是答案......我对此进行了几天的监视,并且经历过,尽管我明确地检查了“我的代码”选项,但它在VS关闭/启动会话之间不会持续存在。最后我发现了为什么......
答案 0 :(得分:7)
为什么在VS选项中禁用启用仅我的代码?
现在,您将在“例外”对话框中获得一个附加选项,以便仅在您未在代码中处理的异常中断:
如果你像这样配置VS,那么当抛出这些内部处理的异常时,调试器不会再破坏。
答案 1 :(得分:0)
我通过使用“ Jeppe Stig Nielsen”的评论解决了这个问题。只需在抛出此异常类型时取消选中“中断”,调试器将不再阻止代码运行。