Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / LECS18.DOC
Скачиваний:
42
Добавлен:
16.04.2013
Размер:
92.67 Кб
Скачать

В файлеbad_cast.Cpp

#include <iostream.h>

#include <typeinfo.h>

#include <stdexception>

using namespace std;

class A {

public:

virtual void foo() { cout <<”в A” <<endl; }

};

class B: public A {

public:

void foo() { cout <<”в B” <<endl; }

};

{

try {

A a,pa; B b, ,pb;

pa = &b;

pb = dynamic_cast<B>( pa); //удачно

pb -> foo();

pa = &a;

pb = dynamic_cast<B>( pa); //неудачно

pb -> foo();

}

catch (bad_cast) {cout << “плохое приведение” <<endl;}

}

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

Исключения стандартной библиотеки наследуются от базового класса exception. Два производных класса – это logic_error (логическая ошибка) и runtime_error (ошибка времени выполнения). Класс логических ошибок включает: bad_cast (ошибка приведения), out_of_range (вне диапазона) и bad_typed (ошибка оператора typeid()), которые должны запускаться в ситуациях, соответствующих названиям перечисленных классов. Класс ошибок на этапе выполнения включает: range_error (ошибка диапазона), overflow_error (переполнение) и bad_alloc (ошибка размещения).

Базовый класс определяет следующую виртуальную функцию:

virtual const char exception : : what() const throw();

Эта функция-член должна быть определена в каждом производном классе для того чтобы предоставить дополнительные полезные сообщения. Пустой список спецификации в throw показывает, что функция сама не запускает исключений.

Практические замечания

Парадоксально, но понятие «восстановления после ошибок» главным образом касается написания корректных программ. Обработка исключений связана с восстановлением после сбоев. Кроме того, это механизм передачи управления. Модель клиент-производитель налагает на производителя ответственность по созданию такого программного обеспечения, которое выдает корректный вывод при приемлемом вводе. Вопрос для производителя состоит в том, чтобы определить, сколько элементов, определяющих, и возможно, исправляющих ошибки, должно быть встроено в программу. Часто клиент лучше «обслуживается» библиотеками, обнаруживающими сбои: он может сам решить, пытаться ли продолжать вычисление.

Любое восстановление в процессе сбоя основано на передачи управления. Неумелая передача управления ведет к хаосу. При восстановлении после сбоя подразуме-

1 Из многочисленных предлагаемых словарями вариантов перевода терминов, связанных с исключениями, мы избрали следующие: исключение (exception), запуск (throw), возбуждение (raise), пробный блок (try block), перехват (catch), обработчик (handler).Таким образом программист может возбудить (запустить) исключение в пробном блоке (то есть в блоке в котором «пробует» выполнить некоторые действия, зная, что может произойти нечто нештатное). Это исключение может быть перехвачено соответствующим обработчиком. Термины «запустить» и «возбудить» являются, как правило, синонимами, но первый обычно намекает на ключевое слово С++ throw и часто используется по отношению к выражению исключения, а последний зачастую употребляют по отношению к исключительным ситуациям вообще (в том числе и тем, которые обрабатываются без использования механизма исключений С++, см.предыдущие разделы данной главы). – Прим.перев.

Соседние файлы в папке Лекции