С одним оператором try можно связать несколько операторов catch. И на прак тике это делается довольно часто. Но все операторы catch должны перехватывать ис ключения разного типа. В качестве примера ниже приведена программа, в которой перехватываются ошибки выхода за границы массива и деления на нуль. // Использовать несколько операторов catch. using System; class ExcDemo4 { static void Main { // Здесь массив 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("Подходящий элемент не найден."); } } } }
Вот к какому результату приводит выполнение этой программы. 4/2 равно 2 Делить на нуль нельзя! 16/4 равно 4 32/4 равно 8 Делить на нуль нельзя! 128 / 8 равно 16 Подходящий элемент не найден. Подходящий элемент не найден.
Как следует из приведенного выше результата, каждый оператор catch реагирует только на свой тип исключения.
Вообще говоря, операторы catch выполняются по порядку их следования в про грамме. Но при этом выполняется только один блок catch, в котором тип исклю чения совпадает с типом генерируемого исключения. А все остальные блоки catch пропускаются.
Перехват всех исключенийВремя от времени возникает потребность в перехвате всех исключений независимо от их типа. Для этой цели служит оператор catch, в котором тип и переменная ис ключения не указываются. Ниже приведена общая форма такого оператора. catch { // обработка исключений }
С помощью такой формы создается "универсальный" обработчик всех исключе ний, перехватываемых в программе.
Ниже приведен пример такого "универсального" обработчика исключений. Об ратите внимание на то, что он перехватывает и обрабатывает оба исключения, IndexOutOfRangeException и DivideByZeroException, генерируемых в программе. // Использовать "универсальный" обработчик исключений. using System; class ExcDemo5 { static void Main { // Здесь массив 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 { // "Универсальный" перехват. Console.WriteLine("Возникла некоторая исключительная ситуация."); } } } }
При выполнении этой программы получается следующий результат. 4/2 равно 2 Возникла некоторая исключительная ситуация. 16/4 равно 4 32/4 равно 8 Возникла некоторая исключительная ситуация. 128 / 8 равно 16 Возникла некоторая исключительная ситуация. Возникла некоторая исключительная ситуация.
Применяя "универсальный" перехват, следует иметь в виду, что его блок должен располагаться последним по порядку среди всех блоков catch.
ПРИМЕЧАНИЕ
В подавляющем большинстве случаев "универсальный" обработчик исключений (не при меняется. Как правило, исключения, которые могут быть сгенерированы в коде, обрабаты ваются по отдельности. Неправильное использование “универсального” обработчика может привести к тому, что ошибки, перехватывавшиеся при тестировании программы, маскируют ся. Кроме того, организовать надлежащую обработку всех исключительных ситуаций в одном обработчике не так-то просто. Иными словами, “универсальный" обработчик исключений может оказаться пригодным лишь в особых случаях, например в инструментальном средстве анализа кода во время выполнения. Вложение блоков try