HTML, Excel, Word, SEOPHP êóðñ äëÿ ÷àéíèêîâ ⇒ Îáðàáîòêà îøèáîê

PHP äëÿ "÷àéíèêîâ"

Èíñòðóìåíòû
Âûáèðàåì IDE
Âûáèðàåì Web-ñåðâåð
Âûáèðàåì ÑÓÁÄ
Ñòðóêòóðà ÿçûêà PHP
Ïåðâûé øàã
Ñèíòàêñèñ
Òèïû äàííûõ
Ïåðåìåííûå è êîíñòàíòû
Îïåðàòîðû
Âûðàæåíèÿ
Óïðàâëÿþùèå ñòðóêòóðû
Ôóíêöèè
Êëàññû
Èñêëþ÷åíèÿ
Îøèáêè
Ìàññèâû
Ãëîáàëüíûå ìàññèâû
Cookies
Ñåññèè
Çàãðóçêà ôàéëîâ
Ðàáîòà ñ ôàéëàìè
Ðàáîòà ñ ôàéëàìè íà äèñêå
Ðàáîòà ñ äàííûìè â ôàéëå
Ïðèìåð óïðàâëåíèÿ ôàéëàìè
Ðàáîòà ñ áàçàìè äàííûõ
Ïîäêëþ÷åíèå
Àíàëèç ðåçóëüòàòîâ
Âûïîëíåíèå çàïðîñîâ
Îòêëþ÷åíèå
Ïðèìåð: îòñëåæèâàíèå ïîëüçîâàòåëåé
Ðàáîòà â ñåòè
Îòïðàâêà ïî÷òû
Áåçîïàñíîñòü
HTTP-àóòåíòèôèêàöèÿ
Çàùèòà ëîãèíîì è ïàðîëåì
Àâòîìàòèçàöèÿ
Ðåãóëÿðíûå âûðàæåíèÿ â PHP
Èíòåãðàöèÿ
PHP è JavaScript



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 àäìèíèñòðàòîðà è äåëàåò äðóãèå ïîëåçíûå îïåðàöèè.

Îáðàáîòêà îøèáîê - îäèí èç âàæíåéøèõ ýëåìåíòîâ íàïèñàíèÿ ñêðèïòîâ. Íåêà÷åñòâåííî íàïèñàííûé ñðèïò ìîæåò ñòàòü íå òîëüêî ãîëîâíîé áîëüþ âåá-ìàñòåðà èëè àäìèíèñòðàòîðà ñàéòà. "Áàæíûé" (îò ñëîâà "áàã" - îøèáêà) ñêðèïò ïðåäñòàâëÿåò ñåðü¸çíóþ óãðîçó áåçîïàñíîñòè.  ðóêàõ óìåëîãî âçëîìùèêà òåêñò îøèáêè ïðåâðàùàåòñÿ â îòìû÷êó, îòêðûâàþùóþ äîñòóï êî âñåìó ñîäåðæèìîìó ñàéòà, à ìîæåò áûòü è ñåðâåðà.



 íà÷àëî ñòðàíèöû



 íà÷àëî ñòðàíèöû