luk Tue Feb 26 12:57:16 2002 EDT Added files: /phpdoc/cs/features error-handling.xml Log:
Index: phpdoc/cs/features/error-handling.xml +++ phpdoc/cs/features/error-handling.xml <?xml version="1.0" encoding="iso-8859-2"?> <chapter id="features.error-handling"> <title>Zpracování chyb</title> <para> V PHP existuje několik druhů chyb a varování. Jsou to: <table> <title>Druhy chyb v PHP</title> <tgroup cols="4"> <thead> <row> <entry>Hodnota</entry> <entry>Konstanta</entry> <entry>Popis</entry> <entry>Poznámka</entry> </row> </thead> <tbody> <row> <entry>1</entry> <entry>E_ERROR</entry> <entry>významné (fatální) runtimové chyby</entry> <entry></entry> </row> <row> <entry>2</entry> <entry>E_WARNING</entry> <entry>runtimová varování (nevýznamné chyby)</entry> <entry></entry> </row> <row> <entry>4</entry> <entry>E_PARSE</entry> <entry>kompilační syntaktické chyby</entry> <entry></entry> </row> <row> <entry>8</entry> <entry>E_NOTICE </entry> <entry> runtimové zprávy (méně vážné než varování) </entry> <entry></entry> </row> <row> <entry>16</entry> <entry>E_CORE_ERROR</entry> <entry>fatální chyby, které se vyskytly během startu PHP</entry> <entry>pouze PHP 4</entry> </row> <row> <entry>32</entry> <entry>E_CORE_WARNING</entry> <entry>varování během startu PHP</entry> <entry>pouze PHP 4</entry> </row> <row> <entry>64</entry> <entry>E_COMPILE_ERROR</entry> <entry>fatální kompilační chyby</entry> <entry>pouze PHP 4</entry> </row> <row> <entry>128</entry> <entry>E_COMPILE_WARNING</entry> <entry>kompilační varování (nevýznamné chyby)</entry> <entry>PHP 4 only</entry> </row> <row> <entry>256</entry> <entry>E_USER_ERROR</entry> <entry>uživatelsky generované chybové zprávy</entry> <entry>PHP 4 only</entry> </row> <row> <entry>512</entry> <entry>E_USER_WARNING</entry> <entry>uživatelsky generovaná varování</entry> <entry>PHP 4 only</entry> </row> <row> <entry>1024</entry> <entry>E_USER_NOTICE </entry> <entry>uživatelsky generované informativní zprávy</entry> <entry>PHP 4 only</entry> </row> <row> <entry></entry> <entry>E_ALL</entry> <entry>všechny z uvedených, které jsou danou verzí PHP podporovány</entry> <entry></entry> </row> </tbody> </tgroup> </table> </para> <para> Výše uvedené hodnoty (ať již číselné nebo symbolické) se používají pro sestavení bitové masky, která specifikuje, které chyby se mají oznamovat. Můžete používat <link linkend="language.operators.bitwise">bitové logické operátory</link> pro kombinaci hodnot nebo maskování určitých druhů chyb. Uvědomte si, že v souboru <filename>php.ini</filename> budou správně interpretovány pouze operátory '|', '~', '!', a '&', a že v <filename>php3.ini</filename> nelze použít žádné z těchto operátorů. </para> <para> V PHP 4 je jako implicitní hodnota pro <link linkend="ini.error-reporting">error_reporting</link> nastaveno <literal>E_ALL & ~E_NOTICE</literal>, tzn. hlášení všech chyb a varování, které nejsou na úrovni E_NOTICE. V PHP 3 je implicitní <literal>(E_ERROR | E_WARNING | E_PARSE)</literal>, což znamená totéž. Uvědomte si, že v souboru <filename>php3.ini</filename> nelze používat konstanty, a proto nastavení <link linkend="ini.error-reporting">error_reporting</link> musí být numerické; tedy například <literal>7</literal>. </para> <para> Iniciální nastavení může být v ini souboru změněno direktivou <link linkend="ini.error-reporting">error_reporting</link>, v serveru Apache v souboru <filename>httpd.conf</filename> direktivou php_error_reporting (php3_error_reporting v PHP 3), a konečně může být též nastaveno skriptem za použití funkce <function>error_reporting</function>. </para> <warning> <para> Pokud upgradujete kód nebo server z PHP 3 na PHP 4, měli byste ověřit tato nastavení a volání <function>error_reporting</function> anebo potlačit hlášení nových typů chyb, zvláště E_COMPILE_ERROR. To může vést k vyprázdnění obsahu dokumentů bez jakékoli informace o tom, co se stalo a kde hledat problém. </para> </warning> <para> Všechny <link linkend="language.expressions">PHP výrazy</link> mohou být také volány s prefixem "@", který vypíná hlášení chyb pro tento jediný výraz. Pokud během provádění výrazu nastane chyba a volba <link linkend="ini.track-errors">track_errors</link> je zapnutá, najdete chybovou zprávu v globální proměnné <literal>$php_errormsg</literal>. </para> <note> <para> <link linkend="language.operators.errorcontrol">Prefixovým operátorem řízení chyb @</link> nelze potlačit chybová hlášení o syntaktických chybách. </para> </note> <warning> <para> V současnosti <link linkend="language.operators.errorcontrol">prefixový operátor řízení chyb</link> v případě kritických chyb (které ukončí provádění skriptu) pouze potlačí chybové hlášení. Jinými slovy, pokud použijete <link linkend="language.operators.errorcontrol">@</link> k potlačení chyb z jisté funkce, která není dostupná nebo byla chybně zapsána, skript zde skončí, aniž by indikoval proč. </para> </warning> <para> Níže uvedený příklad ukazuje použití schopností zpracování chyb v PHP. Definujeme funkci zpracování chyb, která zaznamenává informace do souboru (v XML formátu) a v případě kritické chyby odešle e-mailovou zprávu vývojáři. <example> <title>Použití zpracování chyb ve skriptu</title> <programlisting role="php"> <![CDATA[ <?php // uděláme si vlastní zpacování chyb error_reporting(0); // uživatelsky definovaná funkce pro zpracování chyb function userErrorHandler ($errno, $errmsg, $filename, $linenum, $vars) { // časové razítko položky $dt = date("Y-m-d H:i:s (T)"); // definuje asociativní pole pro chybový řetězec // ve skutečnosti mohou položky obsahovat pouze // hodnoty 2,8,256,512 a 1024 $errortype = array ( 1 => "Error", 2 => "Warning", 4 => "Parsing Error", 8 => "Notice", 16 => "Core Error", 32 => "Core Warning", 64 => "Compile Error", 128 => "Compile Warning", 256 => "User Error", 512 => "User Warning", 1024=> "User Notice" ); // množina chyb, pro které bude uložen výpis proměnných $user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE); $err = "<errorentry>\n"; $err .= "\t<datetime>".$dt."</datetime>\n"; $err .= "\t<errornum>".$errno."</errornum>\n"; $err .= "\t<errortype>".$errortype[$errno]."</errortype>\n"; $err .= "\t<errormsg>".$errmsg."</errormsg>\n"; $err .= "\t<scriptname>".$filename."</scriptname>\n"; $err .= "\t<scriptlinenum>".$linenum."</scriptlinenum>\n"; if (in_array($errno, $user_errors)) $err .= "\t<vartrace>".wddx_serialize_value($vars,"Variables")."</vartrace>\n"; $err .= "</errorentry>\n\n"; // pro testování // echo $err; // ulož do chybového protokolu a pošli mi zprávu (pokud je to kritická chyba) error_log($err, 3, "/usr/local/php4/error.log"); if ($errno == E_USER_ERROR) mail("[EMAIL PROTECTED]","Critical User Error",$err); } function distance ($vect1, $vect2) { if (!is_array($vect1) || !is_array($vect2)) { trigger_error("Incorrect parameters, arrays expected", E_USER_ERROR); return NULL; } if (count($vect1) != count($vect2)) { trigger_error("Vectors need to be of the same size", E_USER_ERROR); return NULL; } for ($i=0; $i<count($vect1); $i++) { $c1 = $vect1[$i]; $c2 = $vect2[$i]; $d = 0.0; if (!is_numeric($c1)) { trigger_error("Coordinate $i in vector 1 is not a number, using zero", E_USER_WARNING); $c1 = 0.0; } if (!is_numeric($c2)) { trigger_error("Coordinate $i in vector 2 is not a number, using zero", E_USER_WARNING); $c2 = 0.0; } $d += $c2*$c2 - $c1*$c1; } return sqrt($d); } $old_error_handler = set_error_handler("userErrorHandler"); // nedefinovaná konstanta, generuje varování $t = I_AM_NOT_DEFINED; // definuje nějaké "vektory" $a = array(2,3,"foo"); $b = array(5.5, 4.3, -1.6); $c = array (1,-3); // generuje uživatelskou chybu $t1 = distance($c,$b)."\n"; // generuje jinou uživatelskou chybu $t2 = distance($b,"i am not an array")."\n"; // generuje hlášení $t3 = distance($a,$b)."\n"; ?> ]]> </programlisting> </example> Toto je pouze jednoduchý příklad, který ukazuje, jak používat <link linkend="ref.errorfunc">Funkce pro zpracování a záznam chyb</link>. </para> <para> Viz také <function>error_reporting</function>, <function>error_log</function>, <function>set_error_handler</function>, <function>restore_error_handler</function>, <function>trigger_error</function>, <function>user_error</function> </para> </chapter> <!-- Keep this comment at the end of the file Local variables: mode: sgml sgml-omittag:t sgml-shorttag:t sgml-minimize-attributes:nil sgml-always-quote-attributes:t sgml-indent-step:1 sgml-indent-data:t indent-tabs-mode:nil sgml-parent-document:nil sgml-default-dtd-file:"../manual.ced" sgml-exposed-tags:nil sgml-local-catalogs:nil sgml-local-ecat-files:nil End: -->