Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ответы по Технологии программирования / Использование блока Finally

.docx
Скачиваний:
7
Добавлен:
21.05.2015
Размер:
7.6 Кб
Скачать

Иногда возникает потребность определить программный блок, который долженвыполняться по выходу из 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 выполняется обязательно.