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

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


inline Account::

Account( const char* name, double opening bal )

: balance( opening bal - ServiceCharge() )

name = new char[ strlen(name) + 1 ]; strcpy( name, name );

acct nmr = get unie acct nmbr() ;

переопределить так:

Функция ServiceCharge() , вызываемая для инициализации члена balance, может возбуждать исключение. Как нужно реализовать конструктор, если мы хотим обрабатывать все исключения, возбуждаемые функциями, которые вызываются при конструировании объекта типа Account?

inline Account::

Account( const char* name, double opening bal )

: balance( opening bal - ServiceCharge() )

try {

name = new char[ strlen(name) + 1 ]; strcpy( name, name );

acct nmbr = get unique acct nmbr ();

catch (... ) {

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

Помещать try-блок в тело функции нельзя:

Поскольку try-блок не охват1вает список инициализации членов, то catch-обработчик, находящийся в конце конструктора, не рассматривается при поиске кандидатов, которые способны перехватить исключение, возбужденное в функции ServiceCharge() .

Использование функционального try-блока - это единственное решение, гарантирующее, что все исключения, возбужденные при создании объекта, будут перехвачены в конструкторе. Для конструктора класса Account такой try-блок можно определить следующим образом:

членов

Рассмотрим еще раз класс Account, описанн1й в главе 14. Его конструктор можно



inline Account::

Account( const char* name, double opening bal )

: balance( opening bal - ServiceCharge() )

name = new char[ strlen(name) + 1 ]; strcpy( name, name ); acct nmr = get unie acct nmbr() ;

catch (... ) {

теперь специальная обработка перехватывает искчения,

возбужденные в ServiceCharge()

Обратите внимание, что ключевое слово try находится перед списком инициализации членов, а составная инструкция, образующая try-блок, охватывает тело конструктора. Теперь предложение catch(... ) принимается во внимание при поиске обработчика исключения, возбужденного как в списке инициализации членов, так и в теле конструктора.

19.2.8. Иерархия классов исключений в стандартной библиотеке C++

В начале этого раздела мы определили иерархию классов исключений, с помощью которой наша программа сообщает об аномальных ситуациях. В стандартной библиотеке C++ есть аналогичная иерархия, предназначенная для извещения о проблемах при выполнении функций из самой стандартной библиотеки. Эти классы исключений вы можете использовать в своих программах непосредственно или создать производные от них классы для описания собственных специфических исключений.

Корневой класс исключения в стандартной иерархии называется exception. Он определен в стандартном заголовочном файле <exception> и является базовым для всех исключений, возбуждаемых функциями из стандартной библиотеки. Класс exception

namespace std { class exception public:

exception() throw();

exception( const exception & ) throw(); exception& operator=( const exception & ) throw(); virtual ~exception() throw(); virtual const char* what() const throw();

имеет следующий интерфейс:

Как и всякий другой класс из стандартной библиотеки C++, exception помещен в пространство имен std, чтобы не засорять глобальное пространство имен программы.



namespace std {

class logic error : public exception { логическая ошибка public:

explicit logic error( const string &what arg );

class invalid argument : public logic error { неверн аргумент public:

explicit invalid argument( const string Swhat arg ); ass out of range : public logic error { вне диапазо

blic:

explicit out of range( const string &what arg ); ass length error : public logic error { неверная дл

blic:

explicit length error( const string &what arg );

class domain error : public logic error { вне допустимой области public:

explicit domain error( const string Swhat arg );

определены следующие такие ошибки:

Функция может возбудить исключение invalid argument, если получит аргумент с некорректным значением; в конкретной ситуации, когда значение аргумента выходит за пределы допустимого диапазона, разрешается возбудить исключение out of range, а length error используется для оповещения о попытке создать объект, длина которого превышает максимально возможную.

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

Самой интересной в этом списке является виртуальная функция what() , которая возвращает C-строку с текстовым описанием возбужденного исключения. Классы, производные от exception, могут заместить what() собственной версией, которая лучше характеризует объект-исключение.

Отметим, что все функции в определении класса exception имеют пустую спецификацию throw() , т. е. не возбуждают никаких исключений. Программа может манипулировать объектами-исключениями (к примеру, внутри catch-обработчиков типа exception), не опасаясь, что функции создания, копирования и уничтожения этих объектов возбудят исключения.

Помимо корневого exception, в стандартной библиотеке есть и другие классы, которые допустимо использовать в программе для извещения об ошибках, обычно подразделяем1х на две больших категории: логические ошибки и ошибки времени выполнения.

Логические ошибки обусловлена: нарушением внутренней логики программ:, например логических предусловий или инвариантов класса. Предполагается, что их можно найти и предотвратить еще до начала выполнения программы. В стандартной библиотеке



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

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