Почему 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.
Как я могу остановить это?
Ответы
Ответ 1
Это кажется "по дизайну". Случается, что у вас, вероятно, есть меню Tools → Options → Debugging → General → Enable Just My Code enabled.
Как Как выполнить разрыв по пользовательским исключениям:
В диалоговом окне "Отладка → Исключения" отображается дополнительный столбец ( "Разрыв, когда исключение обрабатывается пользователем" ), когда включено "Включить только мой код".
По сути, это означает, что всякий раз, когда исключение покидает границу вашего кода (и в этом случае оно падает до кода преобразования платформы .NET), Visual Studio ломается, потому что он считает, что исключение оставило код пользователя, Он не знает, что он вернется в код пользователя позже в стеке.
Итак, есть два способа: отключить "Только мой код" в меню "Инструменты" → "Параметры" → "Отладка" → "Общие" или Снимите флажок из исключенных пользователем исключений .NET Framework в меню "Отладка → Исключения".
Ответ 2
EDIT: Я только что пробовал это сам, и похоже, что отражение рассматривается немного по-другому. Возможно, вы захотите подумать о вызове рефлексии как о начале нового уровня "обрабатываемого" в отношении отладчика: ничто не улавливает это исключение, прежде чем оно будет переведено и обновлено как TargetInvocationException
, поэтому оно ломается. "Не знаю, есть ли способ подавить это - но это происходит очень часто? Если вы регулярно выполняете множество операций, которые приводят к исключениям, вы можете пересмотреть свой дизайн.
Оригинальный ответ
Перейдите к Debug/Exceptions... и посмотрите, что это за настройки. Вы увидите это поведение, если TargetInvocationException
(или что-то большее в иерархии) имеет отметку "Брошено".