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