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 '&amp;', 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 &amp; ~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:
-->

Reply via email to