Помимо генерации исключений генерируемых средствами С#, можно сгенерировать исключение программно, используя инструкцию throw. Формат ее записан таков: throwexceptOb; Элемент exceptOb - это объект класса исключений, производного от классаException. Рассмотрим пример, который демонстрирует использование инструкции throw для генерирования исключения типа DivideByZeroExceptionпрограммно. . usingSystem; // Генерирование исключения вручную classThrowDemo { public static void Main() { try { Console.WriteLine("До генерирования исключения."); throw new DivideByZeroException(); } catch (DivideByZeroException) { // Перехватываемисключение. Console.WriteLine("Исключениеперехвачено."); } Console.WriteLine("После try/catch-блока."); }} Результаты выполнения этой программы имеют такой вид: До генерирования исключения. Исключение перехвачено. После try/catch-блока. Объект исключения типа DivideByZeroException, создан с помощью оператора new в инструкции throw. При создании объекта класса DivideByZeroExceptionиспользовался конструктор по умолчанию, но для генерирования исключений предусмотрены и другие конструкторы. Чаще всего генерируемые исключения являются экземплярами классов исключений, создаваемых в программе. 7.7 Повторное генерирование исключений Исключение, перехваченное одной catch-инструкцией, можно перегенерировать,чтобы обеспечить возможность его перехвата другой (внешней) catch-инструкцией.Самая распространенная причина для повторного генерирования исключения - позволить нескольким обработчикам получить доступ к исключению. Например, возможна такая ситуация, что один обработчик исключений управляет одним аспектомисключения, а второй - другим. Чтобы повторно сгенерировать исключение, достаточно использовать ключевое слово throw, не указывая исключения. Другими словами, используйте следующую форму инструкции throw, throw; При повторном генерировании исключения оно не будет повторноперехватываться той же catch-инструкцией, а передается следующей catch-инструкции. using System; class Rethrow { public static void genException() { / / Здесьмассивnumerдлиннеемассиваdenom. in t[] numer = { 4, 8, 16, 32, 64, 128, 256, 512 }; in t[] denom = { 2 , 0 , 4, 4, 0 , 8 }; for(int i=0; i<numer.Length; i++){ try { Console.WriteLine(numer[i] + " / " + denom[i] + " равно " + numer[l]/denom[i]); } catch (DivideByZeroException) {// Перехватываемисключение. Console.WriteLine("Делитьнанульнельзя!") } catch (IndexOutOfRangeException) { // Перехватываемисключение. Console.WriteLine("Нетсоответствующегоэлемента.") throw; // Генерируемисключениеповторно. }}}} class RethrowDemo { public static void Main() { try { Rethrow.genException(); } catch(IndexOutOfRangeException) { // Перехватываем повторно сгенерированное исключение. Console.WriteLine("Неисправимая ошибка -"программа завершена."); }}} В этой программе ошибки деления на нуль обрабатываются локально (по месту),т.е. в самом методе genException (), но ошибка нарушения границ массива генерируется повторно. В данном случае исключение типа IndexOutOfRangeException обрабатывается функцией Main().
1/--страниц