Почему TargetInvocationException обрабатывается IDE как необнаруженное? - PullRequest
25 голосов
/ 17 апреля 2010

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

object result;
try
{
    result = propertyInfo.GetValue(target, null);

}
catch (TargetInvocationException ex)
{
    result = ex.InnerException.Message;
}
catch (Exception ex)
{
    result = ex.Message;
}

В конечном итоге код работает правильно, однако, когда я работаю под отладчиком:

Когда свойство вызывает исключение, среда IDE попадает в отладчик, как если бы исключение не было обработано. Если я просто нажму «Выполнить», программа будет проходить, и исключение будет получено как TargetInvocationException с действительным исключением в свойстве InnerException.

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

Ответы [ 2 ]

30 голосов
/ 14 мая 2010

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

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

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

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

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

4 голосов
/ 17 апреля 2010

РЕДАКТИРОВАТЬ: Я только что попробовал это сам, и похоже, что отражение рассматривается немного по-другому. Возможно, вы захотите думать о вызове рефлексии как о начале нового уровня «обработки» в том, что касается отладчика: ничто не перехватывает это исключение до того, как оно будет переведено и переброшено как TargetInvocationException, так что оно не работает Не знаю, есть ли какой-нибудь способ помешать этому, но случается ли это очень часто? Если вы регулярно выполняете много операций, которые приводят к исключениям, вы можете пересмотреть свой дизайн.


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

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

...