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

Try-Catch-finally блокирует проблемы с .NET4.5.1

У меня есть простой тестовый код, который работает как ожидается в .NET3.5, но тот же код ведет себя совершенно по-другому в проекте, созданном с .NET4.5.1.

class Program
{
    static void Main(string[] args)
    {
        try
        {
            string a = null;
            var x = a.Length;
        }
        catch (Exception ex)
        {
            throw;
        }
        finally
        {
            Console.WriteLine("This is the finally block.");
        }
        Console.WriteLine("You should not be here if an exception occured!");
    }
}

Прежде всего, странно, что исключение типа NullReferenceException полностью игнорируется в .NET4.5.1 при запуске скомпилированного EXE файла RELEASE. В принципе, ошибка не возникает, хотя в режиме отладки выбрано исключение.

Во-вторых (и самое главное), если ошибка отличается от исключения NullReferenceException, например, например, "индекс вне диапазона", тогда исключение фактически выбрано как ожидалось, но блок "finally" никогда не попадает это не поведение, которое я ожидал от блока try-catch-finally. Я пробовал на разных машинах, и у меня было еще 2 моих коллеги, и мы все получили тот же результат.

Кажется, что либо я никогда не понимал блок try-catch-finally, либо .NET4.5.1 обрабатывает исключение по-другому, или есть некоторая ошибка с .NET4.5.1. Все, что я знаю, это то, что приведенный выше код работает в .NET3.5, поскольку я ожидал, что он сработает, но я, похоже, не получаю тот же результат при его запуске в .NET4.5.1.

Может кто-то пролить свет на это? Прямо сейчас у меня полная потеря.

ИЗМЕНИТЬ На основании ответа Eric J я смог решить проблему NullReferenceException. Поскольку я задал два вопроса, я создам новый поток для второго вопроса. Try-Catch-finally блокировать проблемы с .NET4.5.1

4b9b3361

Ответ 1

string a = null;
var x = a.Length;

В режиме RELEASE джиттер (только во время компилятора) может доказать, что x никогда не ссылается, поэтому он может удалить назначение.

В режиме DEBUG джиттер не выполняет эту оптимизацию.

Чтобы заставить исключение быть брошенным, сделайте что-то с x (например, как @Henk предлагает в комментариях, WriteLine(x)).

ИЗМЕНИТЬ

Эрик Липперт отметил в комментариях

... Я так же удивлен, как и все, что дрожь вернется в строку которая может бросить. Это кажется мне неправильным...

Оптимизация дрожания может быть чрезмерно агрессивной.