|
Программирование >> Программирование на языке c++
Как И раньше, в функции 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 {
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |