Почему TargetInvocationException рассматривается как неотображаемое средой IDE?
У меня есть код, который использует reflection, чтобы вытащить значения свойств из объекта. В некоторых случаях свойства могут генерировать исключения, потому что они имеют нулевые ссылки и т. Д.
object result; try { result = propertyInfo.GetValue(target, null); } catch (TargetInvocationException ex) { result = ex.InnerException.Message; } catch (Exception ex) { result = ex.Message; }
В конечном итоге код работает правильно, однако, когда я запускаю под отладчиком:
Когда свойство генерирует исключение, среда IDE попадает в отладчик, как если бы исключение было неотобрано. Если я просто ударил run, программа протекает через, и исключение появляется как TargetInvocationException с реальным исключением в свойстве InnerException.
- Java List.add () UnsupportedOperationException
- Что такое «случайное исключение»?
- Как генерировать исключения из RepaintManager
- Захват исключений из списка инициализаторов конструктора
- Как создать пользовательские исключения в Java?
Как я могу остановить это?
- исключение исключений из деструктора
- Будут ли исключения C ++ безопасно распространяться через C-код?
- избегая ненужных ссылок
- Идеальный способ установки глобального неотображаемого обработчика исключений в Android
- Исключение исключений в Java без потери трассировки стека
- Разница между C ++ 03 throw () specifier C ++ 11 noexcept
- Насколько медленны исключения .NET?
- Лучшее исключение для неисчерпывающих шаблонов в случае
Кажется, это «по дизайну». Случается, что у вас, вероятно, есть меню Инструменты → Параметры → Отладка → Общие → Включить только мой код .
Как Как: Break on User-Unhandled Excepts :
В диалоговом окне « Отладка → Исключения » отображается дополнительный столбец («Разрыв, когда исключение обрабатывается пользователем»), когда включен «Включить только мой код».
По сути, это означает, что всякий раз, когда исключение выходит из границы вашего кода (и в этом случае оно падает до кода преобразования платформы .NET), Visual Studio ломается, потому что считает, что исключение оставило код пользователя. Он не знает, что он вернется в код пользователя позже в стеке.
Таким образом, есть два способа обхода: отключить только мой код в меню Инструменты → Параметры → Отладка → Общие или Удалить флажок из исключенных пользователем исключений .NET Framework в меню Отладка → Исключения .
EDIT: Я просто пробовал это сам, и похоже, что reflection обрабатывается несколько иначе. Возможно, вы захотите подумать о вызове рефлексии как о начале нового уровня «обработанного» в отношении отладчика: ничто не ловит это исключение, прежде чем оно будет переведено и восстановлено как исключение TargetInvocationException
, поэтому оно не работает. знаете, есть ли способ подавить это – но это происходит очень часто? Если вы регулярно выполняете множество операций, которые приводят к исключениям, вы можете пересмотреть свой дизайн.
Оригинальный ответ
Перейдите в раздел «Отладка / Исключения …» и узнайте, что это за настройки. Вы увидите это поведение, если TargetInvocationException
(или что-то большее в иерархии) провело отметку «Брошено».