Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Малыхина. Массивы....doc
Скачиваний:
22
Добавлен:
22.05.2015
Размер:
502.27 Кб
Скачать

10.4 Оператор throw

Операторы tryмогут многократно вкладываться друг в друга. Исключение, которое возникло во внутреннем блокеtryи не было перехвачено соответствующим блокомсatch, передается на верхний уровень, где продолжается поиск подходящего обработчика. Этот процесс называется распространением исключения.

Распространение исключений предоставляет программисту дополнительные возможности. Например, если на внутреннем уровне недостаточно информации для того, чтобы провести полную обработку ошибки, можно выполнить частичную обработку и сгенерировать исключение повторно, чтобы оно было обработано на верхнем уровне.

До сих пор рассматривались исключения, которые генерирует среда выполнения С#, но это может сделать и сам программист. Для генерации исключения используется операторthrowс параметром, определяющим вид исключения. Параметр должен быть объектом, порожденным от стандартного классаSystem.Ехсерtion. Этот объект используется для передачи информации об исключении его обработчику.

Оператор throwупотребляется либо с параметром, либо без него:

throw [ выражение ];

Форма без параметра применяется только внутри блока саtchдля повторной генерации исключения. Тип выражения, стоящего послеthrow, определяет тип исключения, например:

throw new DividеВуZегоЕхсерtion( ) ;

Здесь после слова throwзаписано выражение, создающее объект стандартного класса «ошибка при делении на 0» с помощью операцииnew. При генерации исключения выполнение текущего блока прекращается и происходит поиск соответствующего обработчика с передачей ему управления. Обработчик считается найденным, если тип объекта, указанного послеthrow, либо тот же, что задан в параметресаtch, либо является производным от него.

Рассмотрим пример, в котором использован оператор throwдля генерации программой исключенияDivideByZeroException.

Листинг 3 – Генерация исключения с помощью оператора throw

using System;

class Demo

{

public static void Main()

{

try

{

Console.WriteLine("Перед генерацией исключения DivideByZeroException");

throw new DivideByZeroException();

}

catch (DivideByZeroException)

{

Console.WriteLine("Произошел перехват исключения");

}

Console.WriteLine("Завершение программы");

}

}

Как видим, в программе вообще отсутствуют какие-либо данные и операции над ними. Тем не менее, в ней есть оператор try, блок которого содержит операторthrow, создающий самостоятельно с помощью ключевого словаnewобъект исключенияDivideByZeroException. Это исключение перехватывается следующим заtryоператоромсаtch.

Результат работы программы:

Если после оператора throwв блокеtryпопытаться выполнить такую инструкцию:

Console.WriteLine("После генерации исключения ");

то она не будет выполнена, а в списке ошибок появится сообщение «Обнаружен недостижимый код».

10.5 Дополнительные сведения

Класс Ехсерtionсодержит несколько полезных свойств (табл. 10.2), с помощью которых можно получить информацию об исключении.

Таблица 10.2 Свойства классаSystem.Exception

Свойство

Описание

НеlpLink

URL файла справки с описанием ошибки

Меssage

Текстовое описание ошибки. Устанавливается при создании объекта. Свойство доступно только для чтения

Source

Имя объекта или приложения, которое сгенерировало ошибку

StackTrace

Последовательность вызовов, которые привели к возникновению ошибки. Свойство доступно только для чтения

InnerException

Содержит ссылку на исключение, послужившее причиной генерации текущего исключения

TargetSite

Метод, выбросивший исключение

Операторы сhecked и unchecked. В языке C# есть возможность управлять генерацией исключений, возникающих при переполнении в арифметических вычислениях, когда может быть получен такой результат, который выходит за границы диапазона типа данных, используемого в данных вычислениях. Рассмотрим такой фрагмент программы:

byte i,j;

i=100; j=100; i=i+10*j;

Ясно, что в результате его выполнения новое значение iне может быть представлено в типеbyte.

Управление процессом генерации исключений в такой ситуации возможно с помощью ключевых слов:

  • сhecked –проверка включена;

  • unchecked –проверка отключена, и если возникнет переполнение, то оно будет проигнорировано; в этом случае значение результата будет усечено до размера целого типа.

Данные ключевые слова употребляются как операции, если они используются в выражениях, и как операторы, если они предваряют блок, например:

а = сhecked (i=i+10*j); // проверка включена для выражения

checked

{ // проверка включена для блока

i=i+10*j;

}

Если значение проверяемого выражения не представимо в описанным для него типе, то генерируется исключение OverflowException.

Ключевое слово uncheckedтакже может быть использовано в двух формах. Первая форма используется для указания, что следует проигнорировать переполнение в одном выражении, а вторая– то же самое, только по отношению к блоку.

Явное задание статуса контроля переполнения для некоторых программ в подозрительных ситуациях весьма желательно, поскольку установки по умолчанию определяются настройкой соответствующей опции компилятора и окружением исполнения программы и могут отличаться от желаемых.