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

Почему TargetInvocationException рассматривается как неотображаемое средой IDE?

У меня есть код, который использует отражение, чтобы вытащить значения свойств из объекта. В некоторых случаях свойства могут вызывать исключения, потому что они имеют нулевые ссылки и т.д.

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.

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

4b9b3361

Ответ 1

Это кажется "по дизайну". Случается, что у вас, вероятно, есть меню Tools → Options → Debugging → General → Enable Just My Code enabled.

Как Как выполнить разрыв по пользовательским исключениям:

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

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

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

Ответ 2

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


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

Перейдите к Debug/Exceptions... и посмотрите, что это за настройки. Вы увидите это поведение, если TargetInvocationException (или что-то большее в иерархии) имеет отметку "Брошено".