Исключения в списке инициализации конструктора. Инициа-
лизировать поля класса можно в списке инициализации конструктора,
причем в качестве инициализирующего выражения может выступать
вызов функции или явный вызов конструктора. При этом вероятно воз-
никновение исключения. Ловить и обрабатывать такие исключения
можно с использованием контролируемого блока уровня функции специ-
ального вида {function-try-block)}.
int f(int); // функция, определенная в другом месте
class С
{
int i;
double d; // поля
public:
C(int, double); // конструктор инициализации
};
C::C(int ii, double id) try:i(f(ii)), d(id) // реализация конструктора
{// ...
}
catch(…) // обработчик исключений
{ // ...
}
Слово try находится перед списком инициализации конструктора –
список инициализации контролируется. Любое исключение, которое сгене-
рирует функция f() будет перехвачено и обработано в секции-ловушке. При
такой организации конструктора отсутствуют операторы после блока
try/catch. Выход из данной ситуации только один – осуществить те действия,
которые возможно осуществить, и перенаправить исключение дальше,
выполнив один из операторов:
throw без аргумента – транслируется перехваченное исключение;
throw с аргументом – генерируется новое исключение.
54
Исключения в деструкторах. Если деструктор, вызванный во
время раскрутки стека, попытается завершить свою работу при помощи
исключения, то система вызовет функцию terminate(). На этапе отладки
программы это допустимо, но в готовом продукте появление таких сооб-
щений должно быть исключено. Следовательно, ни одно из исключений,
которое могло бы появиться в процессе работы деструктора, не должно
покинуть его пределы. Чтобы выполнить это требование: нельзя генери-
ровать исключения в теле деструктора с помощью throw. Если удаление
объекта связано с вызовом других функций, относительно которых нет
гарантий отсутствия генерации исключений, то рекомендуется объеди-
нить эти действия в некотором методе, например, Destroy(), и вызывать
данный метод с использованием блока try/catch.
Т::Destroy()
{ // код, который может генерировать исключения
}
T::~T()
{ try
{ Destroy(); }
catch(…) { … }
}
Достарыңызбен бөлісу: |