Êîãäa ñ ïîìîùüþ thrOw ãåíåðèðóåòñя èñêëþ÷åíèå, ôóíêöèè èñïîëíèòåëüíîé áèáëèîòåêè C++ âûïîëíяþò ñëåäóþùèå äåéñòâèя:
ñîçäaþò êîïèþ ïaðaìåòða thrOw â âèäå ñòaòè÷åñêîãî îáúåêòa, êîòîðûé ñóùåñò- âóåò äî òåõ ïîð, ïîêa èñêëþ÷åíèå íå áóäåò îáðaáîòaíî;
â ïîèñêaõ ïîäõîäяùåãî îáðaáîò÷èêa ðañêðó÷èâaþò ñòåê, âûçûâaя äåñòðóêòî- ðû ëîêaëüíûõ îáúåêòîâ, âûõîäяùèõ èç îáëañòè äåéñòâèя;
ïåðåäaþò îáúåêò è óïðaâëåíèå îáðaáîò÷èêó, èìåþùåìó ïaðaìåòð, ñîâìåñòè- ìûé ïî òèïó ñ ýòèì îáúåêòîì.
Ïðè ðañêðó÷èâaíèè ñòåêa âñå îáðaáîò÷èêè ía êaæäîì óðîâíå ïðîñìaòðèâaþòñя ïîñëåäîâaòåëüíî, îò âíóòðåííåãî áëîêa ê âíåøíåìó, ïîêa íå áóäåò íaéäåí ïîäõî- äяùèé îáðaáîò÷èê.
Îáðaáîò÷èê ñ÷èòaåòñя íaéäåííûì, åñëè òèï îáúåêòa, óêaçaííîãî ïîñëå thrOw:
òîò æå, ÷òî è óêaçaííûé â ïaðaìåòðå CatCh (ïaðaìåòð ìîæåò áûòü çaïèñaí â ôîðìå T, COnst T, T& èëè COnst T&, ãäå T— òèï èñêëþ÷åíèя);
яâëяåòñя ïðîèçâîäíûì îò óêaçaííîãî â ïaðaìåòðå CatCh (åñëè íañëåäîâaíèå ïðîèçâîäèëîñü ñ êëþ÷îì äîñòóïa publiC);
яâëяåòñя óêaçaòåëåì, êîòîðûé ìîæåò áûòü ïðåîáðaçîâaí ïî ñòaíäaðòíûì ïða- âèëaì ïðåîáðaçîâaíèя óêaçaòåëåé ê òèïó óêaçaòåëя â ïaðaìåòðå CatCh.
Èç âûøåèçëîæåííîãî ñëåäóåò, ÷òî îáðaáîò÷èêè ïðîèçâîäíûõ êëaññîâ ñëåäóåò ðaçìåùaòü äî îáðaáîò÷èêîâ áaçîâûõ, ïîñêîëüêó â ïðîòèâíîì ñëó÷aå èì íèêîãäa íå áóäåò ïåðåäaíî óïðaâëåíèå. Îáðaáîò÷èê óêaçaòåëя òèïa vOid aâòîìaòè÷åñêè ñêðûâaåò óêaçaòåëü ëþáîãî äðóãîãî òèïa, ïîýòîìó åãî òaêæå ñëåäóåò ðaçìåùaòü ïîñëå îáðaáîò÷èêîâ óêaçaòåëåé êîíêðåòíîãî òèïa.
Ðaññìîòðèì ïðèìåð.
inClude Class HellO{
// Êëaññ, èíôîðìèðóþùèé î ñâîåì ñîçäaíèè è óíè÷òîzåíèè publiC:
HellO(){COut << "HellO!" << endl;}
~HellO(){COut << "Bye!" << endl;}
};
vOid f1(){
ifstream ifs("\\INVALID\\FILE\\NAME"); // Îòêðûâaåì ôaéë if (!ifs){
COut << "Ãåíåðèðóåì èñêëþ÷åíèå" << endl; thrOw "Îøèáêa ïðè îòêðûòèè ôaéëa";}
}
vOid f2(){
HellO H; // Cîçäaåì ëîêaëüíûé îáúåêò
f1(); // Âûçûâaåì ôóíêöèþ, ãåíåðèðóþùóþ èñêëþ÷åíèå
}
int main(){
try{
COut << "Âõîäèì â try-áëîê" << endl; f2();
COut << "Âûõîäèì èç try-áëîêa" << endl;
}
CatCh(int i){
COut << "Âûçâaí îáðaáîò÷èê int, èñêëþ÷åíèå-" <}
CatCh(COnst Char * p){
COut << "Âûçâaí îáðaáîò÷èê COnst Char*, èñêëþ÷åíèå - "
<< p << endl; return –1;
}
CatCh(¼){
COut << "Âûçâaí îáðaáîò÷èê âñåõ èñêëþ÷åíèé" << endl; return –1;
}
return 0; // Âñå îáîøëîñü áëaãîïîëó÷íî
}
Ðåçóëüòaòû âûïîëíåíèя ïðîãðaììû:
Âõîäèì â try-áëîê HellO!
Ãåíåðèðóåì èñêëþ÷åíèå Bye!
Âûçâaí îáðaáîò÷èê COnst Char *, èñêëþ÷åíèå - Îøèáêa ïðè îòêðûòèè ôaéëa
Îáðaòèòå âíèìaíèå, ÷òî ïîñëå ïîðîæäåíèя èñêëþ÷åíèя áûë âûçâaí äåñòðóêòîð ëîêaëüíîãî îáúåêòa, õîòя óïðaâëåíèå èç ôóíêöèè f1 áûëî ïåðåäaíî îáðaáîò÷èêó, íaõîäяùåìóñя â ôóíêöèè main. Cîîáùåíèå «Âûõîäèì èç try-áëîêa» íå áûëî âû- âåäåíî. Äëя ðaáîòû ñ ôaéëîì â ïðîãðaììå èñïîëüçîâaëèñü ïîòîêè (î íèõ ðaññêa- çûâaåòñя â ãëaâå 10 «Ïîòîêîâûå êëaññû» ía ñ. 265).
Òaêèì îáðaçîì, ìåõaíèçì èñêëþ÷åíèé ïîçâîëяåò êîððåêòíî óíè÷òîæaòü îáúåêòû ïðè âîçíèêíîâåíèè îøèáî÷íûõ ñèòóaöèé. Ïîýòîìó âûäåëåíèå è îñâîáîxäåíèå ðå- ñóðñîâ ïîëåçíî îôîðìëяòü â âèäå nëaññîâ, êîíñòðóêòîð êîòîðûõ âûäåëяåò ðåñóðñ, a äåñòðóêòîð îñâîáîæäaåò.  êa÷åñòâå ïðèìåða ìîæíî ïðèâåñòè êëaññ äëя ðaáîòû ñ ôaéëîì. Êîíñòðóêòîð êëañña îòêðûâaåò ôaéë, a äåñòðóêòîð — çaêðûâaåò.  ýòîì ñëó÷aå åñòü ãaðaíòèя, ÷òî ïðè âîçíèêíîâåíèè îøèáêè ôaéë áóäåò êîððåêòíî ça- êðûò, è èíôîðìaöèя íå áóäåò óòåðяía.
Êaê óæå óïîìèíaëîñü, èñêëþ÷åíèå ìîæåò áûòü êaê ñòaíäaðòíîãî, òaê è îïðåäå- ëåííîãî ïîëüçîâaòåëåì òèïa. Ïðè ýòîì íåò íåîáõîäèìîñòè îïðåäåëяòü ýòîò òèï ãëîáaëüíî — äîñòaòî÷íî, ÷òîáû îí áûë èçâåñòåí â òî÷êå ïîðîæäåíèя èñêëþ÷åíèя è â òî÷êå åãî îáðaáîòêè. Êëaññ äëя ïðåäñòaâëåíèя èñêëþ÷åíèя ìîæíî îïèñaòü âíóòðè êëañña, ïðè ðaáîòå ñ êîòîðûì îíî ìîæåò âîçíèêaòü. Êîíñòðóêòîð êîïèðî- âaíèя ýòîãî êëañña äîëæåí áûòü îáúяâëåí êaê publiC, ïîñêîëüêó èía÷å áóäåò íå- âîçìîæíî ñîçäaòü êîïèþ îáúåêòa ïðè ãåíåðaöèè èñêëþ÷åíèя (êîíñòðóêòîð êîïè- ðîâaíèя, ñîçäaâaåìûé ïî óìîë÷aíèþ, èìååò ñïåöèôèêaòîð publiC).
Do'stlaringiz bilan baham: |