Почему 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.

Как я могу остановить это?

Кажется, это «по дизайну». Случается, что у вас, вероятно, есть меню ИнструментыПараметрыОтладкаОбщиеВключить только мой код .

Как Как: Break on User-Unhandled Excepts :

В диалоговом окне « ОтладкаИсключения » отображается дополнительный столбец («Разрыв, когда исключение обрабатывается пользователем»), когда включен «Включить только мой код».

По сути, это означает, что всякий раз, когда исключение выходит из границы вашего кода (и в этом случае оно падает до кода преобразования платформы .NET), Visual Studio ломается, потому что считает, что исключение оставило код пользователя. Он не знает, что он вернется в код пользователя позже в стеке.

Таким образом, есть два способа обхода: отключить только мой код в меню ИнструментыПараметрыОтладкаОбщие или Удалить флажок из исключенных пользователем исключений .NET Framework в меню ОтладкаИсключения .

EDIT: Я просто пробовал это сам, и похоже, что reflection обрабатывается несколько иначе. Возможно, вы захотите подумать о вызове рефлексии как о начале нового уровня «обработанного» в отношении отладчика: ничто не ловит это исключение, прежде чем оно будет переведено и восстановлено как исключение TargetInvocationException , поэтому оно не работает. знаете, есть ли способ подавить это – но это происходит очень часто? Если вы регулярно выполняете множество операций, которые приводят к исключениям, вы можете пересмотреть свой дизайн.


Оригинальный ответ

Перейдите в раздел «Отладка / Исключения …» и узнайте, что это за настройки. Вы увидите это поведение, если TargetInvocationException (или что-то большее в иерархии) провело отметку «Брошено».

  • Как я могу обнаружить, когда исключение было выбрано глобально в Java?
  • Насколько значительная часть обработки исключений C ++ добавляет
  • Почему люди Java часто потребляют исключения молча?
  • Работа с ошибкой «java.lang.OutOfMemoryError: PermGen space»
  • try / catch с InputMismatchException создает бесконечный цикл
  • Каков правильный способ отображения полного InnerException?
  • Java: глобальный обработчик исключений
  • Обработка исключений Java
  • В чем разница между ошибками и исключениями?
  • Должен ли я получать пользовательские исключения из Exception или ApplicationException в .NET?
  • Однопоточная квартира - не может создавать элементы управления ActiveX
  • Давайте будем гением компьютера.