Для того чтобы указать кодовый блок, который должен выполняться после блокаtry/catch,достаточно вставить блокfinallyв конце последовательности операторовtry/catch.Ниже приведена общая форма совместного использования блоковtry/ catchиfinally.
try {
// Блок кода, предназначенный для обработки ошибок.
}
catch
// Обработчик исключения типа
}
catch (
// Обработчик исключения типа
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 ;
}
}
}
Вот к какому результату приводит выполнение этой программы.
Получить О
Делить на нуль нельзя После выхода из блока try.
Получить 1
Совпадающий элемент не найден.
После выхода из блока try.
Получить 2
После выхода из блока try.
Как следует из приведенного выше результата, блокfinallyвыполняется независимо от причины выхода из блокаtry.
И еще одно замечание: с точки зрения синтаксиса блокfinallyследует после блокаtry,и формально блокиcatchдля этого не требуются. Следовательно, блокfinallyможно ввести непосредственно после блокаtry,опустив блокиcatch.В этом случае блокfinallyначнет выполняться сразу же после выхода из блокаtry,но исключения обрабатываться не будут.
Подробное рассмотрение класса Exception