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

Вложение блоков try C#, Try в C#, C# Полное руководство Герберт Шилдт, Язык программирования C#, C# полное руководство

Один блок 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 может стать “универсальным” для тех ошибок, которые не подлежат обработке во внутреннем блоке.