Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

Выполнится ли блок finally?

#c_sharp #try_catch


static void Main(string[] args)
{
    StreamWriter file = new StreamWriter("file.txt");
    try
    {
        throw new DivideByZeroException();
    }
    catch (StackOverflowException e)
    {
        Console.WriteLine("Error: " + e.Message);
    }
    finally
    {
        file.WriteLine("Error");
        file.Close(); 
    }
    Console.ReadKey();

}

    


Ответы

Ответ 1



A-a-a, я, кажется, начинаю понимать, что Вы имели в виду. Выполнение finally не зависит от типа исключения указанного в catch. Ваш код эквивалентен: try { try { throw new DivideByZeroException(); } catch (StackOverflowException e) { ... } } finally { ... }

Ответ 2



При возникновении исключения общеязыковая среда выполнения (CLR) ищет оператор catch, который обрабатывает это исключение. Если текущий выполняемый метод не содержит такой блок catch, среда CLR выполняет поиск в методе, который вызвал текущий метод, и так далее вверх по стеку вызовов. Если блок catch не находится, то среда CLR отображает пользователю сообщение о необработанном исключении и останавливает выполнение программы. (c) MSDN По finally: С помощью блока finally можно выполнить очистку всех ресурсов, выделенных в блоке try, и можно запускать код даже при возникновении исключения в блоке try. Как правило, операторы блока finally выполняются, когда элемент управления покидает оператор try. Передача управления может возникать в результате выполнения нормального выполнения, break, continue, goto или оператора return, или распространения исключения из оператора try. В рамках обработки исключений, связанный блок finally гарантированно будет выполнен. Однако если исключения необработано, то выполнение блока finally зависит от того, как активирована операция очистки исключения. Это, в свою очередь, зависит от того, как настроен компьютер. Дополнительные сведения см. в статье Обработка необработанных исключений в CLR. (c) MSDN Таким образом выходит, что выполнение блока finally{} происходит после выхода из блока try{} В случае если в try{} происходит ошибка которая не перехватывается ни одним из catch{} в дереве вызовов и не может быть проигнорирована ( системный диалог об ошибке с "продолжить") то выполнение из блока try{} не выходит, и, соответственно, finally{} не отрабатывает. Если выход за try{} возможен т.к. есть перехват исключения выше по стеку вызовов, то сначала выполняется его блок finally{}, а уже за тем отрабатывает блок catch{} перехватывающий исключение. Если ошибка игнорируется то отрабатывает блок finally{} и выполнение программы продолжается далее по коду...

Комментариев нет:

Отправить комментарий