Министерство образования Российской Федерации РОСТОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Надолин К.А. «ОБЪЕКТНО-ОРИЕНТИРОВА...
25 downloads
262 Views
451KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Министерство образования Российской Федерации РОСТОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Надолин К.А. «ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ НА С++»
ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ
Методические указания к спецкурсу для студентов механико-математического факультета специальности "Прикладная математика"
РОСТОВ-НА-ДОНУ
2003
Надолин К.А. «ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ НА С++». Обработка исключительных ситуаций. Методические указания к спецкурсу для студентов механико-математического факультета специальности "Прикладная математика" // Ростов-на-Дону: УПЛ РГУ, 2003. 24 с.
Печатается по решению кафедры математического моделирования (протокол № 1 от 27 января 2003 г.) механико-математического факультета РГУ.
© Надолин К.А., Ростовский государственный университет, 2003.
2
СЛОЖНОСТЬ ЗАДАЧИ ОБРАБОТКИ ОШИБОЧНЫХ СИТУАЦИЙ Концепция программирования с защитой от ошибок предполагает включение в код программного модуля средств контроля его нормального выполнения. Это обеспечивает живучесть и корректную работу программ. Проверить успешность того или иного действия в модуле обычно легко, но как поступить, если возникла ошибка? Пусть, например, при выполнении функции конкатенации строк строка-результат не может полностью вместить все символы присоединяемой строки. Не составит труда запрограммировать эту проверку, но что делать? Возможны, например, следующие варианты решения: • Ситуация фатальная. Следует прервать выполнение программы. • Ничего особенного. Операция выполняется. Сигнализировать о происшествии не требуется. Строка-результат формируется в пределах уместившихся символов. • Ничего особенного. Аргументы остаются без изменения, операция не выполняется. Сигнализировать о происшествии не требуется. • Ситуация неприятная. Требуется сигнализировать о ее возникновении. Перечень возможных решений, очевидно, может быть продолжен, поскольку вопрос о том, как оценивать данную ситуацию, зависит от программируемой задачи. Главная проблема обработки исключительных ситуаций состоит в том, что разработчик библиотеки классов может легко обнаружить возникновение ошибки при выполнении программы, но ему сложно принять решение, как с ней поступить. Пользователь наоборот знает, что предпринять в случае ошибки, но не имеет возможности ее обнаружить (иначе ошибка была бы обработана в пользовательском коде, и от библиотеки ничего бы не потребовалось) [1]. В языке С++ предусмотрены специальные средства для решения этой проблемы, базирующиеся на понятии исключения. Стандарт ANSI С формулирует концепцию и описывает интерфейс языка для обнаружения и обработки исключительных ситуаций, определяя тем самым стиль надежного программирования на С++. Главная идея состоит в том, что функция, сталкивающаяся с неразрешимой проблемой, порождает (вызывает, генерирует, выбрасывает, заявляет) исключение в надежде на то, что вызвавшая ее (прямо или косвенно) функция распознает и решит эту проблему (перехватит и обработает исключение). Исключение есть способ идентификации ситуации. (Для этой цели в С++ может использоваться имя типа (встроенного или пользовательского) и, возможно, имя переменной). Функция, способная обработать определенный тип ситуаций, должна быть соответствующим образом оформлена. 3
Рассмотрим, например, как может быть определена и обработана ошибка, связанная с выходом индекса за границы массива в классе Vector: template class Vector { private: T* v; int int unsigned
lbound; ubound; max_size;
public: // . . . T& operator[]( int ) { if( i < lbound || ubound < i ) throw "Index out of range."; return v[i-lbound]; }; // . . . }; // class Vector Здесь генерируется исключение типа const char*, который соответствует постоянной строке "Index out of range". Ключевое слово throw отвечает оператору языка С++, «выбрасывающему» исключение. Функция, предполагающая контроль индексов, должна содержать программный код, использующий векторный тип в так называемом try-блоке: void f( Vector& w ) { // . . . try { do_something(w); } catch ( const char* s ) { // здесь пользователь имеет возможность // обработать исключительную ситуацию // например, так cerr