Тема 13. Обработка исключительных ситуаций 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Тема 13. Обработка исключительных ситуаций



 

Исключительная ситуация или исключение – это возникновение непредвиденного или аварийного события, которое может порождаться самыми различными причинами, например из-за недостаточности распределяемых ресурсов. Средства обработки исключительных ситуаций чаще всего используются для обработки ошибок, возникающих при работе программы. Таким образом, ошибка в работе программы является частным случаем исключительной ситуации. Обработка исключений позволяет диагностировать возникшее исключение (в частном случае ошибку), восстановить работоспособность программы и продолжить ее выполнение.

Обработка исключительных ситуаций позволяет логически разделить вычислительный процесс на две части – обнаружение аварийной ситуации и ее обработка. Другим достоинством использования средств обработки исключений языка С++ является то, что для передачи информации об ошибке в место ее обработки не требуется применять возвращаемое значение, параметры или глобальные переменные. Поэтому интерфейс функций не раздувается.

Обработка исключений языка С++ обеспечивает передачу управления и информации о возникшей ситуации в неопределенную точку вызова, где было выражено желание обрабатывать исключения этого типа. Исключения любого типа могут возникать и обрабатываться.

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

При возникновении исключения обработчику передается произвольное количество информации с контролем типов.

 

Общий механизм обработки и синтаксис исключений

 

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

Если ошибка имеет место внутри блока try, она возбуждается (throw), перехватывыется (catch) и обрабатывается. Функции, которые вызываются из блока try, также могут возбуждать исключительную ситуацию. Любая исключительная ситуация должна перехватываться инструкцией catch, которая должна располагаться непосредственно за блоком try, возбуждающем исключительную ситуацию. С блоком try может быть связано более одной инструкции catch. То, какая именно инструкция catch используется, зависит от типа исключительной ситуации, оствавшиеся же инструкции блока try игнорируются. Можно перехватывать любые типы данных, включая и типы создаваемых классов программы. Фактически в качестве исключительных ситуаций часто используются именно типы классов.

 

Основная форма инструкции throw:

 

throw исключительная_ситуация;

 

Инструкция throw должна выполняться либо внутри блока try, либо в любой функции, которую этот блок вызывает (прямо или косвеннно). Здесь исключительная_ ситуация – это возбуждаемая инструкцией throw исключительная ситуация.

 

Если возбуждается исключительная ситуация, для которой нет соответствующей инструкции catch, то может произойти ненормальное завершение программы. В соответствии со стандартом Standart C++ возбуждение необрабатываемой исключительной ситуации приводит к вызову стандартной библиотечной функции terminate (). По умолчанию для завершения программы функция terminate () вызывает функцию abort ().

 

Простой пример обработки исключительной ситуации:

 

 

# include < iostream.h >

int main (void)

{ cout <<”Начало\n”;

try { // Начало блока try

cout <<”Внутри блока try \n”;

throw 10; // возбуждение ошибки

cout <<”Эта инструкция не будет выполнена!”;

}

catch (int i) { // Перехват ошибки

cout <<”Перехвачена ошибка номер:”<<i<< endl;

}

cout <<”Конец”;

return 0;

}

 

После выполнения инструкции catch, управление в программе передается следующей за ней инструкции. Тем не менее, обычно блок catch заканчивают вызовом функции exit (), abort () или какой-либо другой функции, принудительно завершающей программу.

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

Блок try можно располагать внутри функции. В этом случае при каждом входе в функцию обработчик исключительной ситуации устанавливается снова.

В некоторых случаях необходимо настроить систему так, чтобы перехватывать все исключительные ситуации, независимо от их типа. Сделать это можно достаточно просто. Для этого используйте следующую форму инструкции catch:

 

catch (...) {// обработка всех исключительных ситуаций},

здесь многоточие соответствует любому типу данных.

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

тип_результата имя_функции (список_аргументов) throw (список_типов) {...}

Здесь в поле список_типов перечисляются через запятые только те типы данных исключительных ситуаций, которые могут быть возбуждены функцией. При попытке возбудить исключительную ситуацию другого типа произойдет аварийное завершение программы. Важно понимать, что ограничить типы возбуждаемых исключительных ситуаций можно только после того, как функция вызвана из блока try. То есть внутри функции блок try может возбудить любой тип исключительной ситуации, коль скоро она перехватывается внутри этой функции.

Можно повторно возбудить исключительную ситуацию. Смысл этого в том, чтобы предоставить возможность обработки исключительной ситуации нескольким процедурам, каждая из которых обрабатывает свой аспект исключительной ситуации. Повторно исключительная ситуация может быть возбуждена только внутри блока catch, или любой функцией, которая вызывается из этого блока.

 

Пример повторного возбуждения исключительной ситуации одного и того же типа.

 

# include < iostream.h >

void Exception ()

{

Try

{ // возбуждение исключительной ситуации типа char *

throw “привет”;

}

// перехват исключительной ситуации типа char *

catch (char *)

{ cout <<”Перехват char * внутри функции Exception ()\n”;

throw; // повторное возбуждение исключительной ситуации типа char *

// но теперь уже не в функции Exception ()

}

}

 

int main (void)

{ cout <<”Начало\n”;

try {Exception (); }

catch (char *) { cout <<”Перехват char * внутри main ()\n”; }

cout <<”Конец”;

return 0;

}

 

На экран программа выводит следующее:

Начало

Перехват char * внутри функции Exception ()

Перехват char * внутри main ()

Конец.

 

В соответствии с современной спецификацией оператора new он возбуждает исключительную ситуацию при неудачной попытке выделения памяти. Стандартными средствами для такого запроса памяти, кроме операции new, являются перегруженные операции, вводимые с помощью операций – функций operator new () и perator new [] (). По умолчанию, если операция new не может выделить требуемое количество памяти, то она возвращает нулевое значение (NULL) и одновременно формирует исключение типа xalloc. Тип xalloc - это класс, определенный в заголовочном файле except.h.

 

Основная литература – 5 [Гл. 12, 445–481], 6 [Гл. 6, 159–177], 8 [Гл. 11, 337–355].

Вопросы контроля

1. Что такое исключение?

2. Для чего нужен блок try и оператор catch?

3. Какую информацию может содержать исключение?

4. Функции, глобальные переменные и классы поддержки механизма исключений.

5. Конструкторы и деструкторы в исключениях.

 



Поделиться:


Последнее изменение этой страницы: 2016-12-13; просмотров: 667; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 34.229.151.93 (0.012 с.)