【发布时间】:2015-01-30 15:18:40
【问题描述】:
使用以下示例代码:(VS 2013,更新 3)
dynamic demo = new ExpandoObject();
demo.Test = 10;
var j = demo.Test; // throws exception
在调试此代码时 'Break when an exception is: 'Thrown'' 在 VS 中检查然后尝试访问 existing 属性 'Test' 会抛出一个 @ 987654326@:
System.Dynamic.ExpandoObject' 不包含“测试”的定义
注意:跳到下一行,变量 j 正确设置为 10。
Q1:为什么会抛出异常,当Test属性肯定存在并且持有值10时,事实变量j已经成功设置了这个值?当我尝试使用像 Test2 这样的真正不存在的属性名称时,会发生完全相同的异常,不同之处在于代码确实会以未处理的异常跳出块......
抛出一个完全错误和误导性的异常,然后在内部处理它只是没有意义,除了它呈现 VS 'Break when an exception is: 'Thrown' 选项功能实际上无法用于使用动态对象的代码。
Q2:是的,我知道这个问题可以通过取消选中“异常时中断:“抛出”选项来隐藏。 但是,如果开发人员使用动态对象并尝试在她/他的代码中查找与动态对象完全无关的异常,则这不是一个选项,此问题使“异常时中断:”抛出“选项不可用,因为那么调试器将停止数以千计的正确属性访问语句。有什么解决办法吗?
我错过了什么?
提前致谢。
* 编辑 * 此编辑在正确答案之后。
Damir 在他的回答中问道“为什么我在 VS 选项中禁用了 Enable Just My Code?”好吧,这就是答案......我被这个问题困扰了几天,并且经历了尽管我明确检查了 Just My Code 选项,但它在 VS 关闭/启动会话之间不会持续存在。终于知道为什么了……
【问题讨论】:
-
不应该发生。查看 ExpandoObject 的来源:referencesource.microsoft.com/#System.Core/Microsoft/Scripting/….
-
Ricardo,你想要一个视频作为证明,还是相信我不是 PhotoShop 编辑的图片 :-)
-
在 .NET Framework 中有几十个异常被抛出、捕获和正确处理。为什么不简单地为该特定异常禁用“抛出时中断”选项,并为所有其他异常启用它?
-
转载。但我需要取消选中
Enable Just My Code(在选项、调试、常规中)才能看到异常,参见。 Damir Arh 的“答案”。 -
@leppie 堆栈跟踪只有一个“帧”,看起来像这样:
" at Microsoft.CSharp.RuntimeBinder.RuntimeBinderController.SubmitError(CError pError)"