Книга: C# 4.0: полное руководство

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

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

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

// Использовать вложенный блок try.
using System;
class NestTrys {
  static void Main() {
    // Здесь массив numer длиннее массива denom.
    int[] numer = { 4, 8, 16, 32, 64, 128, 256, 512 };
    int[] denom = { 2, 0, 4, 4, 0, 8  };
    try {  // внешний блок    try
      for(int i=0; i < numer.Length; i++)    {
        try { // вложенный блок try
          Console.WriteLine(numer[i] + " / " +
                denom[i] + " равно " + numer[i]/denom[i]);
        }
        catch (DivideByZeroException) {
          Console.WriteLine("Делить на нуль нельзя!");
        }
      }
    }
    catch (IndexOutOfRangeException) {
      Console.WriteLine("Подходящий элемент не найден.");
      Console.WriteLine("Неисправимая ошибка - программа прервана.");
    }
  }
}

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

4/2 равно 2
Делить на нуль нельзя!
16/4 равно 4
32/4 равно 8
Делить на нуль нельзя!
128 / 8 равно 16
Подходящий элемент не найден.
Неисправимая ошибка - программа прервана.

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

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

Оглавление книги


Генерация: 1.438. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз