Ответы по Технологии программирования / Использование блока Finally
.docxИногда возникает потребность определить программный блок, который долженвыполняться по выходу из try/catch-блока. Например, исключение может вызватьошибку, которая завершает текущий метод и, следовательно, является причинойпреждевременного возврата. Однако такой метод может оставить открытым файл илисоединение с сетью, которые необходимо закрыть. Подобные обстоятельства — обычное явление в программировании, и С# предоставляет удобный путь выхода из них:блок finally.
Чтобы определить блок кода, подлежащий выполнению по выходу из try/catch-блока, включите в конец try/catch-последовательности блок finally. Общая формазаписи последовательности try/catch-блоков, содержащей блок finally, выглядитследующим образом.
try {
// Блок кода, предназначенный для обработки ошибок.
}
catch (ExcepTypel exOb) {
// Обработчик для исключения типа ExcepTypel.
}
catch (ЕхсерТуре2 ехОb) {
// Обработчик для исключения типа ЕхсерТуре2.
finally {
// Код завершения обработки исключений.
}
Блок finally будет выполнен после выхода из try/catch-блока, независимо от условий его выполнения. Другими словами, при нормальном завершении try-блока или в условиях возникновения исключения содержимое finally-блока будет безусловно отработано. Блок finally выполнится и в том случае, если любой код внутри try-блока или любая из его catch-инструкций определены внутри метода.
Вот пример использования блока finally:
using System;
class UseFmally {
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 {
public static void Main() {
for(int i=0; i < 3;i++){
UseFinally.genException(i);
Console.WriteLine();
}}}
Вот какие результаты получены при выполнении этой программы:
Получаем 0
На нуль делить нельзя!
По окончании try-блока.
Получаем 1
Нет соответствующего элемента.
По окончании try-блока.
Получаем 2
По окончании try-блока.
Как подтверждают результаты выполнения этой программы, независимо от итога завершения try-блока, блок finally выполняется обязательно.