PHP: Îáðàáîòêà îøèáîê
Àâòîð: | Àðòåìüåâ Ñåðãåé Èãîðåâè÷ |
ICQ: | 438856621 |
email: | _spin_@bk.ru |
 ïðåäûäóùåì óðîêå ìû ðàññìîòðåëè îñíîâû îáðàáîòêè èñêëþ÷åíèé è ðàçëè÷èÿ ìåæäó èñêëþ÷åíèÿìè è îøèáêàìè.  ýòîì óðîêå áû èçó÷èì îïðÿäîê îáðàáîòêè îøèáîê.
Îøèáêè â PHP ìîæíî ðàçäåëèòü ïîëüçîâàòåëüñêèå è ñèñòåìíûå. Ê ñîæàëåíèþ, ïåðåõâàòèòü ñèñòåìíûå îøèáêè ñòàíäàðòíûìè ñðåäñòâàìè íåâîçìîæíî è åäèíñòâåííûé ñïîñîá áîðüáû ñ íèìè - ãðàìîòíîå íàïèñàíèå è îòëàäêà êîäà. Åäèíñòâåííîå, ÷òî ìîæíî (è íóæíî) ñäåëàòü - çàïðåòèòü âûâîä â áðàóçåð ëþáûõ ñîîáùåíèé îá îøèáêàõ. Äåëàåòñÿ ýòî ïðè ïîìîùè ôóíêöèè error_reporting(). äèíñòâåííûé ïàðàìåòð ýòîé ôóíêöèè îïðåäåëÿåò êàêèå îøèáêè ðàçðåøåíî âûâîäèòü â áðàóçåð.
<?php // ôóíêöèþ ëó÷øå âñåãî âûçûâàòü // â ñàìîì íà÷àëå, äî âûïîëíåíèÿ // äðóãèõ âûðàæåíèé error_reporing(E_ALL ^ E_NOTICE); // êîä ñêðèïòà ?>
Ïàðàìåòð ôóíêöèè ìîæåò áûòü êîìáèíàöèåé ñëåäóþùèõ êîíñòàíò
Êîíñòàíòà | Îïèñàíèå |
---|---|
E_ERROR | Êðèòè÷åñêèå îøèáêè, ïðåðûâàþùèå âûïîëíåíèå ñêðèïòà (íàïðèìåð, îøèáêà âûäåëåíèÿ ïàìÿòè) |
E_WARNING | Ïðåäóïðåæäåíèÿ |
E_PARSE | Ñèíòàêñè÷åñêèå îøèáêè èñõîäíîãî êîäà |
E_NOTICE | Çàìå÷àíèÿ |
E_CORE_ERROR | Êðèòè÷åñêèå îøèáêè, âîçíèêàþùèå íà ýòàïå çàïóñêà èñïîëíåíèÿ ñêðèïòà |
E_CORE_WARNING | Ïðåäóïðåæäåíèÿ, âîçíèêàþùèå íà ýòàïå çàïóñêà |
E_COMPILE_ERROR | Îøèáêè êîìïèëÿöèè |
E_COMPILE_WARNING | Ïðåäóïðåæäåíèÿ êîìïèëÿöèè |
E_USER_ERROR | Ïîëüçîâàòåëüñêèå îøèáêè, ñîçäàííûå ñ ïîìîùüþ ôóíêöèè trigger_error() |
E_USER_WARNING | Ïîëüçîâàòåëüñêèå ïðåäóïðåæäåíèÿ, ñîçäàííûå ñ ïîìîùüþ ôóíêöèè trigger_error() |
E_USER_NOTICE | Ïîëüçîâàòåëüñêèå çàìå÷àíèÿ, ñîçäàííûå ñ ïîìîùüþ ôóíêöèè trigger_error() |
E_ALL | Âñå âîçìîæíûå îøèáêè, ïðåäóïðåæäåíèÿ è çàìå÷àíèÿ |
E_STRICT | Çàìå÷àíèÿ âðåìåíè âûïîëíåíèÿ |
E_RECOVERABLE_ERROR | Êðèòè÷åñêèå îøèáêè, äîïóñêàþùèå äàëüíåéøåå èñïîëíåíèå êîäà. |
Íàïðèìåð:
<?php // îòîáðàæàòü âñ¸ error_reporting(E_ALL); // îòîáðàæàòü âñ¸, êðîìå çàìå÷àíèé error_reporting(E_ALL ^ E_NOTICE); // îòîáðàæàòü òîëüêî çàìå÷àíèÿ è ïðåäóïðåæäåíèÿ error_reporting(E_NOTICE | E_WARNING); // íå îòîáðàæàòü íè÷åãî error_reporting(0); ?>
Èíîãäà âîçíèêàþò ñëó÷àè, êîãäà íàäî çàïðåòèòü âûâîä îøèáîê íå äëÿ âñåãî ñêðèïòà, à ëèøü äëÿ åãî ÷àñòè.  ýòîì ñëó÷àå íåîáõîäèìî ïîëüçîâàòüñÿ îïåðàòîðîì ïîäàâëåíèÿ îøèáîê "@" (ñîáàêà). Áóäó÷è ïîñòàâëåí ïåðåä âûðàæåíèåì, ýòîò îïåðàòîð çàïðåùàåò âûâîä íà çêðàí âñåõ ñîîáùåíèé, ïðåäóïðåæäåíèé èëè çàìå÷àíèé, ãåíåðèðóåìûõ âûðàæåíèåì. Íàïðèìåð:
<?php $mailed = @mail('', '', ''); // åñëè ïèñüìî íå áóäåò îòïðàâëåíî // íî ôóíêöèÿ ïðîñòî âåðí¸ò false, // íå îòîáðàæàÿ íèêàêèõ îøèáîê if(!$mailed) trigger_error('Îøèáêà îòïðàâêè ïèñüìà'); ?>
Ïîëüçîâàòåëüñêèå îøèáêè ìîãóò áûòü áåç ïðîáëåì ïåðåõâà÷åíû è îáðàáîòàíû, ïðè÷åì îáðàáîòêà îøèáîê ïîñòðîåíà òàêèì îáðàçîì, ÷òî ìîæåò âûïîëíÿòüñÿ áåç çàâåðøåíèÿ îñíîâíîãî ñêðèïòà.
Äëÿ ãåíåðàöèè îøèáêè ñëóæèò ôóíêöèÿ trigger_error(), êîòîðîé ïåðåäà¸òñÿ äâà ïàðàìåòðà - òèï îøèáêè è ñîáñòâåííî å¸ òåêñò. Òèï îøèáêè îïðåäåëÿåòñÿ ñòàíäàðòíûìè êîíñòàíòàìè, ðàññìîòðåííûìè âûøå.
Íàïðèìåð:
<?php if(!isset($user_name) || trim($user_name) == '') trigger_error(E_USER_ERROR, 'Èìÿ ïîëüçîâàòåëÿ íå óêàçàíî'); if(!isset($user_passwd) || trim($user_passwd) == '') trigger_error(E_USER_ERROR, 'Ïàðîëü ïîëüçîâàòåëÿ íå óêàçàí'); ?>
Âûçîâ ôóíêöèè trigger_error íå ïðèâîäèò ê àâàðèéíîìó çàâåðøåíèþ ñêðèïòà, à çíà÷èò âåñü ïîñëåäóþùèé êîä áóäåò íîðìàëüíî èñïîëíÿòüñÿ. Åñëè æå ïðåðâàòü âûïîëíåíèå âñ¸-òàêè íåîáõîäèìî, òî ïðîãðàììèñò äîëæåí ñäåëàòü ýòî "âðó÷íóþ", èñïîëüçóÿ ñðåäñòâà ÿçûêà.
Êàê è äëÿ èñêëþ÷åíèé, äëÿ îøèáîê ìîæíî óñòàíîâèòü ñîáñòâåííûé îáðàáîò÷èê. Äåëàåòñÿ ýòî ïðè ïîìîùè ôóíêöèè set_error_handler(), êîòîðîé ïåðåäà¸òñÿ èìÿ ôóíêöèè-îáðàáîò÷èêà è ñïèñîê òèïîâ îøèáîê, äëÿ êîòîðûõ ýòà ôóíêöèÿ âûçûâàåòñÿ. Ôóíêöèÿ èìååò ÷åòûðå ïàðàìåòðà: íîìåð îøèáêè, òåêñò îøèáêè, èìÿ ôàéëà è íîìåð ñòðîêè, ãäå îøèáêà ïðîèçîøëà. Íàïðèìåð:
<?php function specialHandler($errno, $errstr, $errfile, $errline) { switch ($errno) { case E_USER_ERROR: echo "Êðèòè÷åñêàÿ îøèáêà: <br />\n" . "Íîìåð: $errno <br />\n" . "Òåêñò: $errstr <br />\n" . "Ôàéë: $errfie <br />\n" . "Ñòðîêà: $errline <br />\n"; exit(1); break; case E_USER_WARNING: echo "Ïðåäóïðåæäåíèå: [$errno] $errstr<br />\n"; break; case E_USER_NOTICE: echo "Çàìå÷àíèå: [$errno] $errstr<br />\n"; break; default: echo "Íåèçâåñòíàÿ îøèáêà: [$errno] $errstr<br />\n"; break; } return true; } // óêàçûâàåì, ÷òî íàì íåîáõîäèìî // ïðîâåðÿòü âñå âîçíèêàþùèå îøèáêè set_error_handler('specialHandler', E_ALL); ?>
Åñëè ôóíêöèÿ îáðàáîòêè îøèáêè âîçâðàùàåò true, òî âíóòðåííèé îáðàáîò÷èê PHP íå âûçûâàåòñÿ, à åñëè false - òî ïîñëå âûõîäà èç ïîëüçîâàòåëüñêîé ïðîöåäóðû îøèáêà áóäóò ïåðåäàíà â ñòàíäàðòíûé âíóòðåííèé îáðàáîò÷èê. Ýòî ïîçâîëÿåò ïðîãðàììèñòó ðåàãèðîâàòü òîëüêî íà ÷àñòü âîçíèêàþùèõ îøèáîê, îòäàâàÿ îñòàëüíîå ñòàðíäàðòíûì îáðàáîò÷èêàì PHP.
Âîññòàíîâèòü ïðåäûäóùèé îáðàáîò÷èê ìîæíî, âûçâàâ ôóíêöèþ restore_error_handler():
<?php set_error_handler('myFunction'); // // êîä // restore_error_handler(); ?>
Òàêèì ñïîñîáîì ìîæíî âêëþ÷àòü è âûêëþ÷àòü îáðàáîò÷èêè îøèáîê ïî ìåðå íåîáõîäèìîñòè. Íî çëîóïîòðåáëÿòü òàêèìè îïåðàöèÿìè íå ñòîèò - ñëèøêîì âûñîêà âåðîÿòíîñòü çàïóòàòüñÿ è ïåðåïóòàòü îáðàáîò÷èêè.  áîëüøèíñòâå ñëó÷àåâ äîñòàòî÷íî îäíîãî, íî õîðîøî íàïèñàííîãî îáðàáîò÷èêà, êîòîðûé ïèøåò îøèáêè â ëîã-ôàéë èëè áàçó äàííûõ, ïåðåñûëàåò èõ íà email àäìèíèñòðàòîðà è äåëàåò äðóãèå ïîëåçíûå îïåðàöèè.
Îáðàáîòêà îøèáîê - îäèí èç âàæíåéøèõ ýëåìåíòîâ íàïèñàíèÿ ñêðèïòîâ. Íåêà÷åñòâåííî íàïèñàííûé ñðèïò ìîæåò ñòàòü íå òîëüêî ãîëîâíîé áîëüþ âåá-ìàñòåðà èëè àäìèíèñòðàòîðà ñàéòà. "Áàæíûé" (îò ñëîâà "áàã" - îøèáêà) ñêðèïò ïðåäñòàâëÿåò ñåðü¸çíóþ óãðîçó áåçîïàñíîñòè.  ðóêàõ óìåëîãî âçëîìùèêà òåêñò îøèáêè ïðåâðàùàåòñÿ â îòìû÷êó, îòêðûâàþùóþ äîñòóï êî âñåìó ñîäåðæèìîìó ñàéòà, à ìîæåò áûòü è ñåðâåðà.