Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Руководство_по_C#.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
10 Мб
Скачать
☆

8.6Обработка многочисленных исключений

8.6.1Применение нескольких операторов catch

С одним оператором try можно связать несколько операторов catch. И на практике это делается довольно часто. Но все операторы catch должны перехватывать исключения разного типа:

using System;

namespace ConsoleApplication1

{

class Program

{

static void Main()

{

try

{

Console.Write("Введите число типа byte: ");

byte b = byte.Parse(Console.ReadLine());

int[] myArr = new int[5] { 1, 2, 0, 10, 12 };

Console.WriteLine("Исходный массив: ");

for (int j = 0; j <= myArr.Length; j++)

Console.Write ("{0}\t", myArr[j]);

int i = 120;

Console.WriteLine("\nДелим на число: \n");

foreach (int d in myArr)

Console.WriteLine(i / d);

}

// Обрабатываем исключение, возникающее

// при арифметическом переполнении

catch (OverflowException)

{

Console.Write("Данное число не входит в диапазон

0 - 255");

}

// Исключение при делении на 0

catch (DivideByZeroException)

{

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

}

// Исключение при переполнении массива

catch (IndexOutOfRangeException)

{

Console.WriteLine("Индекс выходит за пределы\n");

}

Console.ReadLine();

}

}

}

Выполнение программы:

Введите число типа byte: 34

Исходный массив:

1 2 0 10 12 Индекс выходит за пределы

Как следует из приведенного выше результата, каждый оператор catch реагирует только на свой тип исключения.

Вообще говоря, операторы catch выполняются по порядку их следования в программе. Но при этом выполняется только один блок catch, в котором тип исключения совпадает с типом генерируемого исключения. А все остальные блоки catch пропускаются.

8.6.2Перехват всех исключений

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

catch {

// обработка исключений

}

С помощью такой формы создается "универсальный" обработчик всех исключений, перехватываемых в программе. Давайте модифицируем предыдущий пример и добавим вместо трех операторов catch, следующий код:

using System;

namespace ConsoleApplication1

{

class Program

{

static void Main()

{

try

{

Console.Write("Введите число типа byte: ");

byte b = byte.Parse(Console.ReadLine());

int[] myArr = new int[5] { 1, 2, 0, 10, 12 };

Console.WriteLine("Исходный массив: ");

for (int j = 0; j <= myArr.Length; j++)

Console.WriteLine("{0}\t", myArr[j]);

int i = 120;

Console.WriteLine("\nДелим на число: \n");

foreach (int d in myArr)

Console.WriteLine(i / d);

}

// Обрабатываем все исключения

catch

{

Console.WriteLine("Возникла непредвиденная ошибка");

}

Console.ReadLine();

}

}

}

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