Подтвердить что ты не робот

Почему "dynamic" ExpandoObject исключает исключение RuntimeBinderException, даже если оно содержит определение свойства?

Используя следующий пример кода: (VS 2013, обновление 3)

dynamic demo = new ExpandoObject();
demo.Test = 10;
var j = demo.Test; // throws exception

При отладке этого кода и "Разрыв, когда исключение:" Брошено "отмечено в VS, а затем пытается получить доступ к существующему свойству" Test ", выдает a RuntimeBinderException:

System.Dynamic.ExpandoObject 'не содержит определения для' Test '

Примечание. Переходя к следующей строке, переменная j установлена ​​правильно на 10.

enter image description here


enter image description here


Q1: Почему генерируется исключение, когда свойство Test определенно существует и содержит значение 10, которое подтверждается фактической переменной j, успешно устанавливающей это значение? Точно такое же исключение возникает, когда я пытаюсь использовать действительно не существующее имя свойства, такое как Test2, с той разницей, что тогда код действительно выпрыгивает из блока с исключением без обработки...

Выбрасывая полностью ложное и вводящее в заблуждение исключение, затем обрабатывайте внутренне, это просто не имеет смысла, кроме того, он отображает VS 'Break, когда исключение: опция "Брошенная" практически непригодна для кода, что использует динамические объекты.

Q2: Да. Я знаю, что эту проблему можно скрыть, сняв флажок "Перерыв, когда исключение: опция" Брошенный ". Однако это не вариант, предполагающий, что разработчик использует динамические объекты и пытается найти исключения в своем коде, которые абсолютно не связаны с динамическими объектами, и эта проблема делает "Break, когда исключение: опция" брошена "непригодна, потому что то отладчик остановит тысячи правильных операторов доступа к свойствам. Есть ли способ обхода?

Пропустил что-то?

Спасибо заранее.


* Редактировать * Это редактирование после правильного ответа.

Дамир спросил в своем ответе: "Почему у меня есть опция" Включить только мой код "в ваших опциях VS?" Ну вот ответ... Я несколько раз пробовал это, и испытал, что, несмотря на то, что я явно проверяю параметр Just My Code, он каким-то образом не сохраняется между сеансами VS close/start. Наконец, я узнал, почему...

enter image description here

4b9b3361

Ответ 1

Почему у вас отключен параметр "Включить только мой код" в параметрах VS?

enter image description here

Теперь вы получите дополнительную опцию в диалоговом окне "Исключения", чтобы разбить только на исключения, которые вы не обрабатывали в своем коде:

enter image description here

Если вы настроите VS таким образом, отладчик больше не будет ломаться, когда будут обработаны эти обработанные внутренне исключения.