Практикум по объектно-ориентированному программированию на базе языка с++ Учебно-методическое пособие


Исключения в списке инициализации конструктора



Pdf көрінісі
бет31/44
Дата21.02.2024
өлшемі0.49 Mb.
#492719
түріПрактикум
1   ...   27   28   29   30   31   32   33   34   ...   44
ООП С

Исключения в списке инициализации конструктора. Инициа-
лизировать поля класса можно в списке инициализации конструктора
причем в качестве инициализирующего выражения может выступать
вызов функции или явный вызов конструктора. При этом вероятно воз-
никновение исключения. Ловить и обрабатывать такие исключения 
можно с использованием контролируемого блока уровня функции специ-
ального вида {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(…) { … } 



Достарыңызбен бөлісу:
1   ...   27   28   29   30   31   32   33   34   ...   44




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет