Книга: C# 4.0: полное руководство
Использование блока finally
Использование блока finally
Иногда требуется определить кодовый блок, который будет выполняться после выхода из блока try/catch
. В частности, исключительная ситуация может возникнуть в связи с ошибкой, приводящей к преждевременному возврату из текущего метода. Но в этом методе мог быть открыт файл, который нужно закрыть, или же установлено сетевое соединение, требующее разрывания. Подобные ситуации нередки в программировании, и поэтому для их разрешения в C# предусмотрен удобный способ: воспользоваться блоком finally
.
Для того чтобы указать кодовый блок, который должен выполняться после блока try/catch
, достаточно вставить блок finally
в конце последовательности операторов try/catch
. Ниже приведена общая форма совместного использования блоков try/catch
и finally
.
try {
// Блок кода, предназначенный для обработки ошибок.
}
catch (ExcepTypel exOb) {
// Обработчик исключения типа ExcepTypel.
}
.
.
.
catch (ЕхсерТуре2 ехОb) {
// Обработчик исключения типа ЕхсерТуре2. }
finally {
// Код завершения обработки исключений.
}
Блок finally
будет выполняться всякий раз, когда происходит выход из блока try/catch
, независимо от причин, которые к этому привели. Это означает, что если блок try
завершается нормально или по причине исключения, то последним выполняется код, определяемый в блоке finally
. Блок finally
выполняется и в том случае, если любой код в блоке try
или в связанных с ним блоках catch
приводит к возврату из метода.
Ниже приведен пример применения блока finally
.
// Использовать блок finally.
using System;
class UseFinally {
public static void GenException(int what) {
int t;
int[] nums = new int [2];
Console.WriteLine("Получить " + what);
try {
switch(what) {
case 0:
t = 10 / what; // сгенерировать ошибку из-за деления на нуль
break;
case 1:
nums[4] =4; // сгенерировать ошибку индексирования массива
break;
case 2:
return; // возврат из блока try
}
}
catch (DivideByZeroException) {
Console.WriteLine("Делить на нуль нельзя!");
return; // возврат из блока catch
}
catch (IndexOutOfRangeException) {
Console.WriteLine("Совпадающий элемент не найден.");
}
finally {
Console.WriteLine("После выхода из блока try.");
}
}
}
class FinallyDemo {
static void Main() {
for(int i=0; i < 3; i++) {
UseFinally.GenException(i);
Console.WriteLine() ;
}
}
}
Вот к какому результату приводит выполнение этой программы.
Получить 0
Делить на нуль нельзя
После выхода из блока try.
Получить 1
Совпадающий элемент не найден.
После выхода из блока try.
Получить 2
После выхода из блока try.
Как следует из приведенного выше результата, блок finally
выполняется независимо от причины выхода из блока try
.
И еще одно замечание: с точки зрения синтаксиса блок finally
следует после блока try
, и формально блоки catch
для этого не требуются. Следовательно, блок finally
можно ввести непосредственно после блока try
, опустив блоки catch
. В этом случае блок finally
начнет выполняться сразу же после выхода из блока try
, но исключения обрабатываться не будут.
- Класс System.Exception
- Основы обработки исключительных ситуаций
- Последствия неперехвата исключений
- Обработка исключительных ситуаций - “изящный” способ устранения программных ошибок
- Применение нескольких операторов catch
- Перехват всех исключений
- Вложение блоков try
- Генерирование исключений вручную
- Использование блока finally
- Подробное рассмотрение класса Exception
- Получение производных классов исключений
- Перехват исключений производных классов
- Применение ключевых слов checked и unchecked
- Использование ключевого слова const
- Блок операторов finally
- Восстановление с использованием инструмента gbak
- Типы страниц и их использование
- Использование констант
- Использование переменной окружения ISC_PATH
- Использование сервера Yaffil внутри процесса
- Использование CAST() с типами дата
- Использование типов содержимого и столбцов
- Вызов хранимых процедур InterBase с использованием стандартного синтаксиса ODBC
- Использование кнопки Автосумма
- 24.7. Использование программы-твикера