Перезапуска 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 кажется, влияет на проблему отображения отладчика.

Спасибо всем, кто откликнулся.

Ответы на вопрос(6)

Ваш ответ на вопрос