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

1 ... 90 91 92 [ 93 ] 94 95 96 ... 159


Как И раньше, в функции operator записано выражение throw range(), которое активизируется в случае использования ошибочного индекса. Аналогичное выражение записано и в конструкторе, оно активизируется при задании очень большого (превышающего, например, значение шах) размера строки. Тогда конструктор можно представить в виде:

string::string(unsigned s)

{if((s<0)(s>max)) throw sz();............... }

Теперь исключения можно использовать и для того, чтобы установить, правильно ли сконструирован объект. Выше говорилось о том, что конструктор не возвращает никаких значений, поэтому нельзя использовать традиционные подходы проверки возвращаемых значений для определения правильности конструирования объекта. Приведенный пример показывает, как можно решить такую задачу другими способами [19, с. 50-58].

Мы определили два типа исключений range и sz, в результате надо поместить два обработчика исключений catch после блока try:

void main(void)

{ .....................

try {

описание и выполнение каких-то операций с объектами класса string }

catch (string::range) {

.................... }

catch (string::sz) {

.................... }

При наличии ошибки активизируется соответствующий обработчик исключения. После выполнения всех инструкций в теле обработчика и при условии, что программа не прервана, очередной инструкцией будет первая инструкция, которая встречается после всех обработчиков исключений, относящихся к текущему блоку try. Рассмотрим пример: void f(void)

{ ...............



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

catch (string::range) {

исправление ошибки и повторный вызов функции f

f(); }

catch (string::sz) {

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

В целом список обработчиков исключений подобен конструкции switch в языке С. Однако здесь отсутствует-необходимость записи инструкции break после соответствующих инструкций case.

Функция f может перехватывать лишь некоторые исключения. Например, можно рассмотреть такие две функции f 1 и f2, что первая из них (П) перехватывает только исключение sz, а вторая - range. В этом случае после блока try первой функции записывается один блок catch(string::sz), а после блока try второй функции - один блок catch(string::range).

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

#include <iostream.h> #include <stdlib.h> #define m 100

#define ss 101 если уменьшить значение этой константы, то не будет ошибки при конструировании объекта class sz{}; индикатор ошибки при конструировании объекта

class string {

char* pointer to string;

unsigned size; public:

string(int);



~string() { delete pointer to string; }

class range {}; индикатор ошибки индекса

char& operator[](int);

char& string::operator[](int j)

if ((j<0)(j>=size)) throw range(); return pointer to string[j];

string::strlng(int SIZE)

if ((SIZE>m)](SIZE<0)) throw ::sz(); pointer to string = new char(size=SIZE); for(int i=0;i<size;i++) pointer to string[i]=i+0;

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

cout \nEnter index: ; cin index; cout str[index]; }

catch(string::range) { cout wrong index\n ; }

ошибка в индексе catch(sz) { cout constructors error\n ; ошибка exit(1); } конструирования объекта

Вторая программа показывает использование в функции main двух блоков try, один из которых позволяет выявить ошибки конструирования объекта, а второй - ошибки индекса.

#include <iostream.h> #include <stdlib.h> #define m 100

#define ss 5 измените эту константу при необходимости class string {



1 ... 90 91 92 [ 93 ] 94 95 96 ... 159

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