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

1 ... 92 93 94 [ 95 ] 96 97 98 ... 159


return pointer to string[j];

string::string(int SIZE)

{ pointer to string = new char(size=SIZE);

for{int i=0;i<size;i++) pointer to string[i]=i+0;

void main{void) { string str(ss); int index;

try { cout \nEnter index: ;

cin >> index;

cout str[index]; } catch(string::range ob) {

cout bad index: ob.get index() endl;

ob.index range{); }

В случае ввода ошибочного индекса программа возвращает значение этого индекса и диапазон допустимых индексов.

7.4. Иерархия исключений

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

исключения, которые возникают при динамическом выделении памяти;

> исключения, которые возникают при ошибках вво-да(вывода);

♦ исключения, которые возникают при работе с файлами;

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



ривают некоторый пустой класс, который назовем, например, exception. Это позволяет построить иерархическую структуру сединым корнем. Тогда блоки try и catch будут представлены примерно в таком виде:

try {.....................}

catch(group N) {..........} обработка конкретного

исключения нижнего уровня (класс group N)

catch(group N-1) {..........} обработка

исключений следующего уровня (класс group N-1 является базовым для класса group N)

catch(...) {..........} обработка всех

возможных исключений

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

Иногда обработчик исключения активизируется, но не знает, как устранить возникшую ошибку, более того, возможно, не знает и о том, что делать дальше. В этом случае он может активизировать то же исключение снова в надежде на то, что какой-то другой обработчик знает, как решить эту задачу. Повторная активизация исключения осуществляется инструкцией throw без аргументов, например:

try {.....................}

catch(клacc-индикaтop исключения)

{ if (знает как обработать исключение) обработка

исключения;

throw; повторная активизация того же исключения

Рассмотрим пример, который показывает использование простейшей иерархии классов исключений.

#inciude <iostream.h> 288



#define ss 10

struct exc base { базовый класс-индикатор исключения exc base() { cout exc base\n ; }

struct exc derived : public exc base { производный класс-exc derived() { cout exc derived\n ; } индикатор

class string {

char* pointer to string; public:

unsigned size;

string(unsigned);

-StringO { delete pointer to string; } class range {}; char& operator[](int);

char& string::operatorn(int j)

{ if {(j<0)ll(j>=size)) throw exc derived(); производное

исключение if ((J<2)(j>=size-2)) throw exc baseO; базовое

исключение if ((J<4)(j>=size-4)) throw range(); какое-то любое

исключение

return pointer to string[j];

string::string(unsigned SIZE)

{ pointer to string = new char{size=SIZE);

for(int i=0;i<size;i-l-+) pointer to string[i]=i-l-0;

void main(void) { string str(ss);

int index;

try {

cout \nEnter index: ; cin >> index;

10 B. A. Скляров 289



1 ... 92 93 94 [ 95 ] 96 97 98 ... 159

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