Вложение try-блоков


Один try-блок можно вложить в другой. Исключение, сгенерированное во внут­реннем try-блоке и не перехваченное catch-инструкцией, которая связана с этим try-блоком, передается во внешний try-блок.

 

Пример.

В следующей программе исключение типа IndexOutOfRangeException перехватывается не внутренним try-блоком, а внешним.

 

using System;

class Demo

{

public static void Main()

{

// Здесь массив a длиннее массива b.

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

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

 

 

try

{ // Внешний try-блок.

for (int i = 0; i < a.Length; i++)

{

try

{ // Вложенный try-блок.

Console.WriteLine (a[i] + " / " + b[i] + " = " + a[i] / b[i]);

}

catch (DivideByZeroException)

{

Console.WriteLine ("На ноль делить нельзя!");

}

}

}

 

catch (IndexOutOfRangeException)

{

Console.WriteLine ("Нет соответствующего элемента.");

Console.WriteLine ("Неисправимая ошибка. " +

"Программа завершена.");

return;

}

. . . . . . . . . .

}

}

 

Исключение, которое может быть обработано внутренним try-блоком (в данном случае это деление на нуль), позволяет программе продолжать работу.

 

Однако нару­шение границ массива перехватывается внешним try-блоком и заставляет программу завершиться.

 

Внешние try-блоки можно также использовать в качестве механизма "глобаль­ного перехвата" для обработки тех ошибок, которые не перехватываются внутренними блоками.

 

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

Возникновение и обработка исключения, как правило, приводит к нетипичному завершению программы. При этом в программе могут остаться неосвобожденные ресурсы, например, открытые файлы.

 

Для освобождения ресурсов используют блок finally.

Этот блок должен следовать за блоком try или catch. Последний является необязательным.

Формат:

try

{

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

}

catch (ExcepTypel exOb)

{

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

}

catch (ExcepType2 exOb)

{

// Обработчик для исключения типа ЕхсерТуре2.

}

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

finally

{

// Код завершения обработки исключений.

}

 

Блок finally будет выполнен в любом случае – было сгенерировано исключение или нет.

Блок finally не может быть определен без блока try. Эта пара (как правило, с блоками catch) может находиться и внутри вызываемого метода.

В одной программе (методе) может быть несколько блоков finally. Все эти блоки будут выполнены после своих try-блоков.

 

Пример.

public static void Main()

{

try

{

double c = double.Parse(Console.ReadLine());

}

catch (Exception e)

{

Console.WriteLine("Error: " + e.Message);

return;

}

finally

{

Console.WriteLine("Здесь освобождаются ресурсы." +

"Блок выполняется всегда");

}

}

 



Дата добавления: 2019-02-08; просмотров: 626;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.008 сек.