|
Программирование >> Инициализация объектов класса, структура
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х на две больших категории: логические ошибки и ошибки времени выполнения. Логические ошибки обусловлена: нарушением внутренней логики программ:, например логических предусловий или инвариантов класса. Предполагается, что их можно найти и предотвратить еще до начала выполнения программы. В стандартной библиотеке
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.003
При копировании материалов приветствуются ссылки. |