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:
-->