Почему мой "наконец-то" не сбежит? - PullRequest
4 голосов
/ 19 ноября 2011

Полагаю, я упускаю что-то действительно тривиальное здесь, но по причине, это не очевидно для меня.Я всегда предполагал, что «наконец-то» всегда выполняется, независимо от исключения или нет.

В любом случае, этот код не был выполнен, и я не уверен, почему.Он достигает i = i / j и выдает исключение DivideByZero, но я бы подумал, что он продолжит и выполнит оператор finally перед остановкой.

static void Main(string[] args)
{
    int i = 1;

    try
    {
        int j = 0;
        i = i / j;

        Console.WriteLine("can't get");
    }
    finally
    {
        Console.WriteLine("finally ran");
    }
}

Ответы [ 5 ]

5 голосов
/ 19 ноября 2011

Взгляните на это MSDN try-finally (Справочник по C #)

Сверху ссылка:

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

4 голосов
/ 19 ноября 2011

у меня работает - хоть немного. Когда я запускаю это как консольное приложение из командной строки, диалоговое окно «Test.exe перестало работать. Windows ищет решение» появляется сразу же, но затем, если я нажимаю кнопку «Отмена», я вижу, что «наконец-то запустился» ». Если я позволю начальному диалогу завершиться и просто останусь с Debug или Close, то нажатие Close приведет к немедленному завершению процесса , а нажатие на Debug, очевидно, вызовет отладчик.

РЕДАКТИРОВАТЬ: Ответ Марк Холл объясняет поведение более подробно. Я оставлю этот ответ, поскольку он содержит экспериментальные результаты, но посмотрите на ответ Марка:)

2 голосов
/ 20 ноября 2011

В ответе Марка написано , что происходит , но я подумал, что упомяну почему:

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

Если блок finally был выполнен заранее, тогда вы не можете обработать исключение в отладчике.

0 голосов
/ 21 ноября 2011

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

0 голосов
/ 19 ноября 2011

попробуйте это:


static void Main(string[] args)
     {
        int i = 1;</p>

<code>    try
    {
        int j = 0;
        i = i / j;

        Console.WriteLine("can't get");
    }
    catch(Exception ex){
        Console.WriteLine(ex.Message);
     }
    finally
    {
        Console.WriteLine("finally ran");
    }
    Console.WriteLine("Press enter to exit...");
    Console.ReadLine();
}

...