Программирование >>  Программирование на языке c++ 

1 ... 87 88 89 [ 90 ] 91 92 93 ... 159


Конструкция: catch (.....) {

называется обработчиком исключения (сравните с обработчиком прерывания, используемом, например, для обработки аналогичных ситуаций в компьютерах IBM PC). Обработчик исключения можно использовать только сразу после блока try или сразу после другого обработчика исключений, если предполагается обработка нескольких исключительных ситуаций. Слова try, catch, throw являются ключевыми в языке С++. Таким образом, общую идею обработки исключений неформально можно выразить так: программа пользователя:

try (попытка) { в скобках {} - try блок Попытайтесь делать что-то, и если не возникают какие-то особые ситуации, то продолжайте в том же духе. Если возникнет что-то необычное, то выполнение операций в try блоке прерывается сигналом извне и осуществляется автоматический переход к catch блоку. }

catch (поимка) (...) { в скобках {} - catch блок Обработка ошибочной ситуации }

библиотечная программа (библиотечный класс):

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

В целом механизм обработки исключений представляет собой альтернативу традиционным методам, каковыми являются: завершение программы (если возникает ошибка); воз-



вращение значения, указывающего на ошибку; установление некоторого кода ошибки (см., например, глобальную переменную ermo дяя программ на языке С); вызов некоторой функции, которая обрабатывает ошибку. В работе [1] показано, что эти традиционные методы в общем случае хуже. Техника обработки исключений позволяет вьщелить в программе отдельные относительно независимые части: собственно программу (try блок) и фрагмент для обработки ошибок (catch блок). Это делает программу более читабельной и регулярной. Механизм обработки исключений можно рассматривать как аналог соответствующих проверок на этапе выполнения программы по отношению к проверкам правильности типа и выявлению различных неоднозначностей на этапе компиляции программы. В результате этот механизм непосредственно поддерживает хороший стиль программирования, так как плохая программа будет периодически прерываться (завершаться), а не давать ошибочные результаты.

В заключение укажем, что рассмотренный механизм приемлем только для выявления синхронных исключений, т. е. таких, которые можно сопоставить с выполнением различных действий в самой программе. Асинхронные исключения, генерируемые, например, аппаратно (сигналами от таймера), нельзя непосредственно обрабатывать с помощью этого механизма.

Рассмотрим примеры. Первая простейшая программа показывает использование конструкций throw, try, catch. Здесь вложенный класс range используется как индикатор исключения (рис. 7.1). Такой класс может быть не только вложенным, но и внешним (глобальным). Это будет показано в последующих примерах.

#include <iostream.h> #define ss 10 class string {

char* pointer to string;

unsigned size; public:

string(unsigned SIZE) это конструктор { pointer to string = new char(size=SlZE); } StringO { delete pointer to string; }



Класс string

индикатор исключения

Класс range

operator[]. {... throw rangeO ...}

ф установка признака

исключения


Программа пользователя

1. Объявление объекта str класса string 2. Вызов функции operator[ ] (str [index]) для объекта str класса string

нет ошибки в значении index есть ошибка в значении index

переход к новой

итерации цикла

(а) выполнение инструкции throw в функции operator[ ]

© активизация обработчика исключения catch (string::range) {..............................}

(3) завершение программы

Рис. 7.1. Генерация исключения (throw rangeO) и обработка исключения ( catch (string: :range) )

class range { }; локальный класс индикатор

исключения char& operator[](int); функция operator[]

char& string::operator[](int j) описание функции operator[] { if ((j<0)(j>=size)) throw range(); генерация исключения

return pointer to string[j]; }

void main(void) { int index;

string str(ss); описание объекта str класса string

for(int i=0;i<ss;i+-l-)

str[i]=i+A; присваивание значений символам строки str try { for(;;) { бесконечный цикл



1 ... 87 88 89 [ 90 ] 91 92 93 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика