|
Программирование >> Инициализация объектов класса, структура
explicit range error( const string &what arg ); ass overflow error : public runtime error { переп blic: explicit overflow error( const string &what arg ); class underflow error : public runtime error { потеря значимости public: explicit underflow error( const string &what arg ); работать. В стандартной библиотеке определены следующие такие ошибки: Функция может возбудить исключение range error, чтобы сообщить об ошибке во внутренних вычислениях. Исключение overflow error говорит об ошибке арифметического переполнения, а underflow error - о потере значимости. Класс exception является базовым и для класса исключения bad alloc, которое возбуждает оператор new() , когда ему не удается выделить запрошенный объем памяти (см. раздел 8.4), и для класса исключения bad cast, возбуждаемого в ситуации, когда ссылочный вариант оператора dynamic cast не может быть выполнен (см. раздел 19.1). Переопределим оператор operator[] в шаблоне Array из раздела 16.12 так, чтобы он возбуждал исключение типа range error, если индекс массива Array выходит за границы: Ошибки времени выполнения, напротив, вызваны событием, с самой программой не связанным. Предполагается, что их нельзя обнаружить, пока программа не начала namespace std { class runtime error : public exception { ошибка времени выполнения public: explicit runtime error( const string &what arg ); class range error : public runtime error { ошибка диапазона public: #include <stdexcept> #include <string> template <class elemType> class Array { public: ... elemTypeS operator[]( int ix ) const { if ( ix < 0 ix >= size ) { string eCbj = ошибка: вне диапазона в Array<elemType>::operator[]() ; throw out of range( eCbj ); return ia[ix]; ... private: int size; elemType * ia; Для использования предопределенных классов исключений в программу необходимо включить заголовочный файл <stdexcept>. Описание возбужденного исключения содержится в объекте eCbj типа string. Эту информацию можно извлечь в обработчике int main() { try { функция main() такая же, как в разделе 16.2 catch ( const out of range Sexcep ) { печатается: ошибка: вне диапазона в Array<elemType>::operator[]() cerr << excep.what() << \n ; return -1; с помощью функции-члена what() : В данной реализации выход индекса за пределы массива в функции try array() приводит к тому, что оператор взятия индекса operator[]() класса Array возбуждает исключение типа out of range, которое перехватывается в main() . Упражнение 19.5 Какие исключения могут возбуждать следующие функции: #include <stdexcept> (a) void operate() throw( logic error ); (b) int mathErr( int ) throw( underflow error, overflow error ); (c) char manip( string ) throw( ); Упражнение 19.6 Объясните, как механизм обработки исключений в C++ поддерживает технику программирования захват ресурса - это инициализация; освобождение ресурса - это уничтожение . Упражнение 19.7 #include <stdexcept> int main() { try { использование функций из стандартной библиотеки catch( exception ) { } catch( runtime error &re ) { } catch( overflow error eobj ) { Исправьте ошибку в списке catch-обработчиков для данного try-блока: Упражнение 19.8 int main() { использование стандартной библиотеки Дана программа на C++: Модифицируйте main() так, чтобы она перехватывала все исключения, возбуждаемые функциями стандартной библиотеки. Обработчики должны печатать сообщение об ошибке, ассоциированное с исключением, а затем вызывать функцию abort() (она определена в заголовочном файле <cstdlib>) для завершения main() . 19.3. Разрешение перегрузки и наследование A Наследование классов оказывает влияние на все аспекты разрешения перегрузки функций (см. раздел 9.2). Напомним, что эта процедура состоит из трех шагов: 1. Отбор функций-кандидатов.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |