Повторное генерирование исключений C#

Повторное генерирование исключений C#, Генерирование исключений C#, Исключения C#, C# Полное руководство Герберт Шилдт, Язык программирования C#, C# полное руководство

Исключение, перехваченное в одном блоке catch, может быть повторно сгенерировано в другом блоке, чтобы быть перехваченным во внешнем блоке catch. Наиболее вероятней причиной для повторного генерирования исключения служит предоставление доступа к исключению нескольким обработчикам. Допустим, что один обработчик оперирует каким-нибудь одним аспектом исключения, а другой обработчик — другим его аспектом. Для повторного генерирования исключения достаточно указать оператор throw без сопутствующего выражения, как в приведенной ниже форме.

throw;

Не следует, однако, забывать, что когда исключение генерируется повторно, то оно не перехватывается снова тем же самым блоком catch, а передается во внешний блок catch.
В приведенном ниже примере программы демонстрируется повторное генерирование исключения. В данном случае генерируется исключение 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};

      for (int i=0; i<numer.Length; i++) {
         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 ().