Программирование >>  Инициализация объектов класса, структура 

1 ... 333 334 335 [ 336 ] 337 338 339 ... 395


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. Отбор функций-кандидатов.



1 ... 333 334 335 [ 336 ] 337 338 339 ... 395

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