Перезапуска Eclipse было достаточно - исключение во время выполнения становится нормальным, а не нулевым. Другие отладчики могут быть не очень добрыми.
ите ниже для объяснения того, что происходит
У меня действительно странная проблема, когда обнаруженное исключение - ноль.
Код использует MEF и старается сообщать об ошибках композиции. Используя отладчик, я вижу, как выдается исключение (InvalidOperationException
) но когда он перехватывается последним блоком catch в коде нижеex
переменная равна нулю. Это верно как в отладчике, так и при нормальном выполнении кода.
static T ResolveWithErrorHandling<T>() where T : class
{
try
{
IocContainer.Compose(Settings.Default.IocConfiguration);
return IocContainer.Resolve<T>();
}
catch (ReflectionTypeLoadException ex)
{
// ... special error reporting for ReflectionTypeLoadException
}
catch (Exception ex)
{
// ex is null - that should not be possible!
// ... general error reporting for other exception types
}
return null;
}
Код, который я заменил комментариями, - это действительно простой код для форматирования сообщения об ошибке. Ничего странного там не происходит.
Я попытался изменить код, чтобы выяснить, какой эффект это может иметь:
Если я уберу первый блок catch (ReflectionTypeLoadException
) исключение, пойманное в последнем блоке catch, больше не равно нулю.Если я ловлю другой тип исключения в первом блоке catch, то исключение, пойманное в последнем блоке catch, больше не равно нулю.Если я добавлю блок catch дляInvalidOperationException
в качестве первого блока catch исключение, пойманное в этом блоке, не является нулевым.Если я добавлю блок catch дляInvalidOperationException
между двумя блоками catch исключение, пойманное в этом блоке, равно нулю.Проект используетКодовые контракты и код, сгенерированный компилятором, подвергается последующей обработке для проверки контрактов. К сожалению, я не нашел способа избавиться от этого в целях тестирования, не выполняя серьезную операцию над проектом.
Мой текущий обходной путь - не пойматьReflectionTypeLoadException
и вместо того, чтобы перейти на типex
в общем обработчике исключений.
Что может быть объяснением этого «невозможного» поведения? Что случилось сReflectionTypeLoadException
поймать блок?
Смущает, что исключение не является нулевым, и оно не может быть нулевым согласно стандарту C # 15.9.5.
Тем не менее, используя кодовые контракты в проектеможет испортить отображение локальных переменных в отладчике потому что код IL, сгенерированный компилятором, может быть переписан Code Contracts, поэтому окончательный код IL немного не синхронизирован с отладочной информацией. В моем случаеex
переменная отображается как ноль, даже если это не так. Неудачный характер сообщения об ошибках, происходящего непосредственно перед закрытием приложения, означал, что я полагал, что сообщение об ошибке не будет вызвано в результатеex
быть нулевым иex.Message
бросатьNullReferenceException
внутри моего улова блока Используя отладчик, я смог «проверить», чтоex
был нулевым, за исключением того, что он фактически не был нулевым.
Моя путаница усугублялась тем фактом, чтоReflectionTypeLoadException
кажется, влияет на проблему отображения отладчика.
Спасибо всем, кто откликнулся.