C++: библиотека программиста



Download 1,95 Mb.
Pdf ko'rish
bet45/144
Sana24.02.2022
Hajmi1,95 Mb.
#223123
TuriРеферат
1   ...   41   42   43   44   45   46   47   48   ...   144
Bog'liq
C -Eldjer-Djeff-for-Real-Programmers-RUS-www.itlibitum.ru

 
67 
Ваша функция завершения обязана завершить программу и не может инициировать другие 
исключения. Она может выполнить необходимые подготовительные действия, но никогда не 
возвращает управление вызывающей программе. 
Вложенная обработка исключений 
Да, вложение блоков 
try/catch
разрешается, хотя пользоваться этой возможностью следует как 
можно реже, если только вы хотите сохранить дружеские отношения с персоналом сопровождения 
вашей программы. 

try 

try 

try 

// Ненадежный фрагмент 

catch(...) 



catch(...) 



catch(...) 



Создавать подобную мешанину приходится довольно редко, но иногда возникает необходимость в 
разделении стековых объектов по разным областям действия. 
Внешние исключения не перехватываются! 
Вы можете перехватить любое исключение, инициированное посредством 
throw
. Тем не менее, 
существуют и другие исключения, которые не удается перехватить переносимыми способами. 
Например, если пользователь применяет для завершения программы комбинацию клавиш с правым 
Ctrl, нет гарантии, что операционная система сгенерирует исключение, которое может быть 
перехвачено вашими обработчиками. Вообще говоря, обработка исключений относится только к 
исключениям, сгенерированным программой; все остальное непереносимо. 
Конструкторы и деструкторы 
Одно из принципиальных достоинств стандартной схемы обработки исключений — раскрутка стека 
(unwinding the stack). При запуске исключения автоматически вызываются деструкторы всех стековых 
объектов между 
throw
и 
catch

void fn() throw(int) { 
Foo 
aFoo; 
// 
Что-то не так! 
throw(bad_news); 

Когда возникает исключение, до передачи стека соответствующему обработчику будет вызван 
деструктор 
aFoo
. Тот же принцип действует и для 
try
-блока вызывающей стороны. 

try 

Bar 
b; 
fn(); // 
Вызывает исключение 



 68 
catch(int exception) { 
// 
Перед тем, как мы попадем сюда, будет вызван деструктор b 


Вообще говоря, гарантируется вызов деструкторов всех стековых объектов, сконструированных с 
начала выполнения 
try
-блока. Это может пригодиться для закрытия открытых файлов
предотвращения утечки памяти или для других целей. Тем не менее, дело не обходится без некоторых 
нюансов. 
Уничтожаемые объекты 
Гарантируется вызов деструкторов всех стековых объектов, сконструированных с начала выполнения 
try
-блока, но и только. Например, допустим, что к моменту возникновения исключения был 
сконструирован массив. Деструкторы вызываются лишь для тех объектов массива, которые были 
сконструированы до возникновения исключения. 
Динамические объекты (то есть созданные посредством оператора 
new
) — совсем другое дело. Вам 
придется самостоятельно следить за ними. Если в куче размещаются объекты, которые должны 
уничтожаться в результате исключения, обычно для них создается оболочка в виде вспомогательного 
стекового объекта. 
class TempFoo { 
private: 
Foo* 
f; 
public: 
TempFoo(Foo* aFoo) : f(aFoo) {} 
~TempFoo() { delete f; } 
}; 
try { 
TempFoo tf(new Foo); 
// 
и т.д. 

catch(...) { 
// 
Foo 
уничтожается деструктором tf 

Исключения во время конструирования 
Рассмотрим следующий процесс конструирования: 
class Foo {...} 
class Bar : public Foo { 
private: 

a; 

b; 
public: 
Bar(); 
}; 
Bar::Bar() 


x; 
throw(bad_news); 

y; 




Download 1,95 Mb.

Do'stlaringiz bilan baham:
1   ...   41   42   43   44   45   46   47   48   ...   144




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish