Выбрать главу

IndexOutOfRangeException.

// Сгенерировать исключение повторно.

using System;

class Rethrow {

public static void GenException()    {

// Здесь массив    numer    длиннее массива denom.

int[] numer = {    4, 8,    16, 32, 64, 128, 256, 512 };

int[] denom = {    2, 0,    4, 4, 0, 8 };

try {

Console.WriteLine(numer[i] + " / " +

denom[i] + " равно " + numer[i]/denom[i]);

}

catch (DivideByZeroException) {

Console.WriteLine("Делить на нуль нельзя!");

}

catch (IndexOutOfRangeException) {

Console.WriteLine("Подходящий элемент не найден."); throw; // сгенерировать исключение повторно

}

}

}

}

class RethrowDemo { static void Main() { try {

Rethrow.GenException ();

}

catch(IndexOutOfRangeException) {

// перехватить исключение повторно

Console.WriteLine("Неисправимая ошибка - программа прервана.");

}

}

}

В этом примере программы ошибки из-за деления на нуль обрабатываются локально в методе GenException (), но ошибка выхода за границы массива генерируется повторно. В данном случае исключение IndexOutOfRangeException обрабатывается в методе Main ().

Использование блока finally

Иногда требуется определить кодовый блок, который будет выполняться после выхода из блока try/catch. В частности, исключительная ситуация может возникнуть в связи с ошибкой, приводящей к преждевременному возврату из текущего метода. Но в этом методе мог быть открыт файл, который нужно закрыть, или же установлено сетевое соединение, требующее разрывания. Подобные ситуации нередки в программировании, и поэтому для их разрешения в C# предусмотрен удобный способ: воспользоваться блоком finally.

Для того чтобы указать кодовый блок, который должен выполняться после блока try/catch, достаточно вставить блок finally в конце последовательности операторов try/catch. Ниже приведена общая форма совместного использования блоков try/ catch и finally.

try {

// Блок кода, предназначенный для обработки ошибок.

}

catch (ExcepTypel exOb) {

// Обработчик исключения типа ExcepTypel.

}

catch (ЕхсерТуре2 ехОЬ) {

// Обработчик исключения типа ЕхсерТуре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() ;

}

}

}

Вот к какому результату приводит выполнение этой программы.

Получить О

Делить на нуль нельзя После выхода из блока try.

Получить 1

Совпадающий элемент не найден.

После выхода из блока try.

Получить 2

После выхода из блока try.

Как следует из приведенного выше результата, блок finally выполняется независимо от причины выхода из блока try.

И еще одно замечание: с точки зрения синтаксиса блок finally следует после блока try, и формально блоки catch для этого не требуются. Следовательно, блок finally можно ввести непосредственно после блока try, опустив блоки catch. В этом случае блок finally начнет выполняться сразу же после выхода из блока try, но исключения обрабатываться не будут.