19.2.7. Конструкторы и функциональные try-блоки
19.2.7. Конструкторы и функциональные try-блоки
Можно объявить функцию так, что все ее тело будет заключено в try-блок. Такие try-блоки называются функциональными. (Мы упоминали их в разделе 11.2.) Например:
int main() {
try {
// тело функции main()
}
catch ( pushOnFull ) {
// ...
}
catch ( popOnEmpty ) {
// ...
}
Функциональный try-блок ассоциирует группу catch-обработчиков с телом функции. Если инструкция внутри тела возбуждает исключение, то поиск его обработчика ведется среди тех, что следуют за телом функции.
Функциональный try-блок необходим для конструкторов класса. Почему? Определение конструктора имеет следующий вид:
имя_класса( список_параметров )
// список инициализации членов:
: член1(выражение1 ) , // инициализация член1
член2(выражение2 ) , // инициализация член2
// тело функции:
{ /* ... */ }
выражение1 и выражение2 могут быть выражениями любого вида, в частности функциями, которые возбуждают исключения.
Рассмотрим еще раз класс Account, описанный в главе 14. Его конструктор можно переопределить так:
nline Account::
Account( const char* name, double opening_bal )
: _balance( opening_bal - ServiceCharge() )
{
_name = new char[ strlen(name) + 1 ];
strcpy( _name, name );
_acct_nmbr = get_unique_acct_nmbr();
}
Функция ServiceCharge(), вызываемая для инициализации члена _balance, может возбуждать исключение. Как нужно реализовать конструктор, если мы хотим обрабатывать все исключения, возбуждаемые функциями, которые вызываются при конструировании объекта типа Account?
Помещать try-блок в тело функции нельзя:
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-блок не охватывает список инициализации членов, то catch-обработчик, находящийся в конце конструктора, не рассматривается при поиске кандидатов, которые способны перехватить исключение, возбужденное в функции ServiceCharge().
Использование функционального try-блока – это единственное решение, гарантирующее, что все исключения, возбужденные при создании объекта, будут перехвачены в конструкторе. Для конструктора класса Account такой try-блок можно определить следующим образом:
inline Account::
Account( const char* name, double opening_bal )
try
: _balance( opening_bal - ServiceCharge() )
{
_name = new char[ strlen(name) + 1 ];
strcpy( _name, name );
_acct_nmbr = get_unique_acct_nmbr();
}
catch (...) {
// теперь специальная обработка
// перехватывает исключения,
// возбужденные в ServiceCharge()
}
Обратите внимание, что ключевое слово try находится перед списком инициализации членов, а составная инструкция, образующая try-блок, охватывает тело конструктора. Теперь предложение catch(...) принимается во внимание при поиске обработчика исключения, возбужденного как в списке инициализации членов, так и в теле конструктора.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Функциональные клавиши
Функциональные клавиши
Функциональные возможности Excel
Функциональные возможности Excel Excel 2007 позволяет формировать и выводить на печать документы, представленные в табличном виде, выполнять расчеты на основании исходных данных и др. Задачи, решаемые с помощью табличного редактора Excel, кратко перечислены ниже.• Создание,
Назначение и функциональные возможности
Назначение и функциональные возможности Программа Microsoft Outlook 2007 обладает широкими функциональными возможностями, которые кратко можно сформулировать следующим образом:• выполнение функций персонального органайзера;• работа с электронной почтой (создание,
Функциональные клавиши
Функциональные клавиши Обычно вы посылаете команду ЭВМ, нажимая на клавишу с надписью enter (ввод), с/r (возврат каретки) или return (возврат). Названия клавиш иногда обозначаются прописными буквами. Пусть клавиша [enter] — [ввод]. Здесь квадратные скобки означают, что вы должны
Лекция № 9. Функциональные зависимости
Лекция № 9. Функциональные зависимости 1. Ограничение функциональной зависимости Ограничения уникальности, накладываемые объявлениями первичного и кандидатных ключей отношения, является частным случаем ограничений, связанных с понятием функциональных
Функциональные объекты
Функциональные объекты Функциональные объекты - это объекты, для которых определён operator(). Они важны для эффективного использования библиотеки. В местах, где ожидается передача указателя на функцию алгоритмическому шаблону, интерфейс установлен на приём объекта с
Функциональные клавиши
Функциональные клавиши Для удобной работы с системой сохраняется возможность использования функциональных клавиш:• F1 – вызов справочной системы AutoCAD;• F2 – переключение между текстовым и графическим окнами;• F3 или Ctrl+F – включение/отключение текущих режимов объектной
1.10 Конструкторы
1.10 Конструкторы Определение ostream как класса сделало члены данные зарытыми. Только функция член имеет доступ к закрытым членам, поэтому надо предусмотреть функцию для инициализации. Такая функция называется конструктором и отличается тем, что имеет то же имя, что и ее
8.5.5 Конструкторы
8.5.5 Конструкторы Функция член с именем, совпадающим с именем ее класса, называется конструктором. Если класс имеет конструктор, то он вызывается для каждого объекта этого класса перед тем, как этот объект будет калибо использован, см. #8.6.Конструктор не может быть virtual или
3.3.1 Функциональные возможности
3.3.1 Функциональные возможности a) Установка (инсталляция)Если установка пакета может быть выполнена пользователем, то при ее проведении должна быть обеспечена возможность успешной установки программ в соответствии с информацией, содержащейся в руководстве по
4.1 Функциональные возможности (Functionality)
4.1 Функциональные возможности (Functionality) Набор атрибутов, относящихся к сути набора функций и их конкретным свойствам. Функциями являются те, которые реализуют установленные или предполагаемые потребности:Примечания1 Данный набор атрибутов характеризует то, что
А.2.1 Функциональные возможности (Functionality)
А.2.1 Функциональные возможности (Functionality) А.2.1.1 Пригодность (Suitability) Атрибут программного обеспечения, относящийся к наличию и соответствию набора функций конкретным задачам.Примечание - Примерами Соответствия является состав функций, ориентированных на задачу, из
4.1.2. Функциональные клавиши
4.1.2. Функциональные клавиши В верхней части клавиатуры размещено 12 (от F1 до F12) функциональных клавиш (рис. 30). Функции, выполняемые этими клавишами, зависят от работающей в данный момент программы, т. е. реакцию на нажатие каждой функциональной клавиши задает программист.
Как работают блоки питания персональных компьютеров? Какие блоки питания бывают?
Как работают блоки питания персональных компьютеров? Какие блоки питания бывают? http://pc-doc.spb.ru/atx.html Блок питания — жизненно важная часть компьютера, без которой его функционирование невозможно. Лишенный блока питания компьютер — всего лишь мертвая коробка, наполненная