Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ответы по Технологии программирования / Генерирование исключений программно, Повторное генерирование исключений

.docx
Скачиваний:
8
Добавлен:
21.05.2015
Размер:
7.72 Кб
Скачать

Помимо генерации исключений генерируемых средствами С#, можно сгенерировать исключение программно, используя инструкцию 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().