Исключения в конструкторах и деструкторах
ßçûê C++ íå ïîçâîëяåò âîçâðaùaòü çía÷åíèå èç êîíñòðóêòîða è äåñòðóêòîða. Ìåõaíèçì èñêëþ÷åíèé äaåò âîçìîæíîñòü ñîîáùèòü îá îøèáêå, âîçíèêøåé â êîí- ñòðóêòîðå èëè äåñòðóêòîðå îáúåêòa. Äëя èëëþñòðaöèè ñîçäaäèì êëaññ VeCtOr, â êîòîðîì îãðaíè÷èâaåòñя êîëè÷åñòâî çaïðaøèâaåìîé ïaìяòè:
Class VeCtOr{ publiC:
Class Size{}; // Êëaññ èñêëþ÷åíèя
enum {max = 32000}; // Ìaêñèìaëüíaя äëèía âåêòîða VeCtOr(int n) // Êîíñòðóêòîð
{ if (n<0 || n>max) thrOw Size(); … }
…
};
Ïðè èñïîëüçîâaíèè êëañña VeCtOr ìîæíî ïðåäóñìîòðåòü ïåðåõâaò èñêëþ÷åíèé òèïa Size:
try{
VeCtOr *p = new VeCtOr(i);
…
}
CatCh(VeCtOr::Size){
… // Îáðaáîòêa îøèáêè ðaçìåða âåêòîða
}
 îáðaáîò÷èêå ìîæåò èñïîëüçîâaòüñя ñòaíäaðòíûé íaáîð îñíîâíûõ ñïîñîáîâ âû- äa÷è ñîîáùåíèé îá îøèáêå è âîññòaíîâëåíèя. Âíóòðè êëañña, îïðåäåëяþùåãî èñ- êëþ÷åíèå, ìîæåò õðaíèòüñя èíôîðìaöèя îá èñêëþ÷åíèè, êîòîðaя ïåðåäaåòñя îá- ðaáîò÷èêó. Cìûñë ýòîé òåõíèêè ç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öèè new è â êîí- ñòðóêòîðå âîçíèêíåò èñêëþ÷åíèå, ïaìяòü èç-ïîä îáúåêòa êîððåêòíî îñâîáîæäa- åòñя.
Иерархии исключений
Èñïîëüçîâaíèå ñîáñòâåííûõ êëaññîâ èñêëþ÷åíèé ïðåäïî÷òèòåëüíåå ïðèìåíåíèя ñòaíäaðòíûõ òèïîâ äaííûõ. C ïîìîùüþ êë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çîì:
Class Matherr{};
Class OverflOw: publiC Matherr{}; // Ïåðåïîëíåíèå
Class UnderflOw: publiC Matherr{}; // Èñ÷åçíîâåíèå ïîðяäêa Class ZerODivide: publiC Matherr{}; // Äåëåíèå ía íîëü
Äëя ïðåäñòaâëåíèя îøèáîê ââîäa/âûâîäa ìîãóò èñïîëüçîâaòüñя ñëåäóþùèå êëaññû:
Class IOerr{};
Class Readerr: publiC IOerr{}; // Îøèáêa ÷òåíèя Class Writerr: publiC IOerr{}; // Îøèáêa çaïèñè Class Seekerr: publiC IOerr{}; // Îøèáêa ïîèñêa
 çaâèñèìîñòè îò îáñòîяòåëüñòâ ìîæíî èñïîëüçîâaòü ëèáî îáðaáîò÷èê èñêëþ÷å- íèé áaçîâîãî êëañña, êîòîðûé áóäåò ïåðåõâaòûâaòü è ïðîèçâîäíûå èñêëþ÷åíèя, ëèáî ñîáñòâåííûå îáðaáîò÷èêè ïðîèçâîäíûõ êëaññîâ.
Cóùåñòâóåò ðяä ñòaíäaðòíûõ èñnëþ÷åíèñ, êîòîðûå ãåíåðèðóþòñя îïåðaöèяìè èëè ôóíêöèяìè C++ (ñì. ãëaâó 16 «Äðóãèå ñðåäñòâa ñòaíäaðòíîé áèáëèîòåêè», ñ. 378). Âñå îíè яâëяþòñя ïðîèçâîäíûìè îò áèáëèîòå÷íîãî êëañña exCeptiOn, îïè- ñaííîãî â çaãîëîâî÷íîì ôaéëå . Íaïðèìåð, îïåðaöèя new ïðè íåóäa÷- íîì âûäåëåíèè ïaìяòè ãåíåðèðóåò èñêëþ÷åíèå òèïa bad_allOC.
Ïðîãðaììèñò ìîæåò îïðåäåëèòü ñîáñòâåííûå èñêëþ÷åíèя, ïðîèçâîäíûå îò ñòaí- äaðòíûõ.
0>
Do'stlaringiz bilan baham: |