С++ для начинающих




Возбуждение исключения - часть 3


#include "stackExcp.h"

void iStack::pop( int &top_value )

{

   if ( empty() )

      throw popOnEmpty();

   top_value = _stack[ --_top ];

   cout << "iStack::pop(): " << top_value << endl;

}

void iStack::push( int value )

{

   cout << "iStack::push( " << value << " )\n";

   if ( full() )

      throw pushOnFull( value );

   _stack[ _top++ ] = value;

}

Хотя исключения чаще всего представляют собой объекты типа класса, инструкция throw может генерировать объекты любого типа. Например, функция mathFunc() в следующем примере возбуждает исключение в виде объекта-перечисления . Это корректный код C++:

enum EHstate { noErr, zeroOp, negativeOp, severeError };

int mathFunc( int i ) {

   if ( i == 0 )

      throw zeroOp;  // исключение в виде объекта-перечисления

   // в противном случае продолжается нормальная обработка

}

Упражнение 11.1

Какие из приведенных инструкций throw ошибочны? Почему? Для правильных инструкций укажите тип возбужденного исключения:

(a) class exceptionType { };

    throw exceptionType();

(b) int excpObj;

    throw excpObj;

(c) enum mathErr { overflow, underflow, zeroDivide };

    throw mathErr zeroDivide();

(d) int *pi = excpObj;

    throw pi;

Упражнение 11.2

У класса IntArray, определенного в разделе 2.3, имеется функция-оператор operator[](), в которой используется assert() для извещения о том, что индекс вышел за пределы массива. Измените определение этого оператора так, чтобы в подобной ситуации он генерировал исключение. Определите класс, который будет употребляться как тип возбужденного исключения.




Содержание  Назад  Вперед