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

Вложенный try-finally в С#

Почему не строка "Console.WriteLine" ( "asdf" ); казнят? Все остальные. Разве это не должно быть так, как мы не можем выпрыгнуть из области видимости?

static bool Func()
{
    try
    {
        try
        {
        }
        finally
        {
            try
            {
                throw new ApplicationException();
            }
            finally
            {
                Console.WriteLine("asd");
            }

            Console.WriteLine("asdf");
        }
    }
    finally
    {
        Console.WriteLine("asd");
    }
}
4b9b3361

Ответ 1

Наконец блокирует только гарантию (по крайней мере, главным образом гарантию, см., кроме MSDN ниже), что они будут введены в том случае, если блок try выдает исключение. Если вы выберете исключение внутри блока finally, исключение заставит элемент управления оставить блок finally, а остальная часть кода внутри этого блока finally не будет выполнена.

В вашем случае строка, которая не выполняется, возникает после исключения в одном и том же блоке finally, поэтому она пропускается.

Из MSDN - try-finally:

Блок finally полезен для очистки любых ресурсов, которые выделяется в блоке try и для запуска любого кода, который должен выполняться даже если исключение происходит в блоке try. Как правило, операторы блока finally выполняются, когда элемент управления пытаетсяутверждение о том, происходит ли передача контроля в результате нормальное выполнение выполнения break, продолжить, перейти или вернутьсяоператора или распространения исключения из инструкции try.

В обработанном исключении обеспечивается связанный блок finallyдля запуска. Однако, если исключение необработанно, выполнение Блок finally зависит от того, как выполняется операция отмены исключения срабатывает. Это, в свою очередь, зависит от того, как настроен ваш компьютер. Дополнительные сведения см. В разделе Обработка необработанных исключений в среде CLR.

Примечание: Обработка необработанных исключений в среде CLR является ссылкой на статью в выпуске журнала MSDN за сентябрь 2008 года. Все 2008 и более старые выпуски журнала MSDN доступны только в виде файлов .chm, и их нужно будет загрузить перед просмотром.

Ответ 2

Я думаю, что лучше всего на это можно ответить, используя код и, следовательно, следующее изображение enter image description here

Ответ 3

Потому что исключение выбрасывается в этот блок finally, поэтому он приводит к тому, что элемент управления выпадает в окончательный окончательный блок. Таким образом, "asdf" WriteLine никогда не выполняется.

Ответ 4

Исключения, выделенные в блоке finally (или catch), отменяют оставшуюся часть этого блока finally (или catch).

Ответ 5

Ошибка происходит внутри 3-го блока try, что приводит к его соответствующему окончательному исполнению. Тем не менее, это приводит к тому, что ошибка заканчивается из текущего и попадает в исходный блок try-finally.

Ответ 6

потому что у вас есть бросок в блок try, и он выполнит окончательный блок с Console.WriteLine("asd"); и выйдет на внешний try catch

Ответ 7

Когда я использовал блоки try-finally для кода, развернутого в разных хостах, я обнаружил, что: когда никаких исключений не было брошено на блок try.

некоторые платформы Windows всегда выполняли блок finally и некоторые платформы никогда не выполняли блок finally.

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