#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{} и выполнение программы продолжается далее по коду...
Комментариев нет:
Отправить комментарий