tom Sun Mar 17 14:53:52 2002 EDT Modified files: /phpdoc/de/features error-handling.xml Log: file is complete now, full transl. will follow
Index: phpdoc/de/features/error-handling.xml diff -u phpdoc/de/features/error-handling.xml:1.6 phpdoc/de/features/error-handling.xml:1.7 --- phpdoc/de/features/error-handling.xml:1.6 Wed Dec 12 15:46:05 2001 +++ phpdoc/de/features/error-handling.xml Sun Mar 17 14:53:52 2002 @@ -1,38 +1,303 @@ <?xml version="1.0" encoding="iso-8859-1"?> +<!-- EN-Revision: 1.24 Maintainer: tom Status: working --> <chapter id="features.error-handling"> <title>Fehlerbehandlung</title> + + <para> + Es gibt verschiedene Arten von Fehlermeldungen und Warnungen in PHP. + Diese sind: + + <table> + <title>PHP Fehlertypen</title> + <tgroup cols="4"> + <thead> + <row> + <entry>Wert</entry> + <entry>Konstante</entry> + <entry>Beschreibung</entry> + <entry>Bemerkung</entry> + </row> + </thead> + <tbody> + <row> + <entry>1</entry> + <entry>E_ERROR</entry> + <entry>Schwere Laufzeitfehler</entry> + <entry></entry> + </row> + <row> + <entry>2</entry> + <entry>E_WARNING</entry> + <entry>Laufzeit-Warnungen (keine schweren Fehler)</entry> + <entry></entry> + </row> + <row> + <entry>4</entry> + <entry>E_PARSE</entry> + <entry>Fehler beim Parsen während des Kompilierens</entry> + <entry></entry> + </row> + <row> + <entry>8</entry> + <entry>E_NOTICE </entry> + <entry> + Mitteilungen zur Laufzeit (weniger ernst als Warnungen) + </entry> + <entry></entry> + </row> + <row> + <entry>16</entry> + <entry>E_CORE_ERROR</entry> + <entry>Schwere Fehler während dem Start von PHP</entry> + <entry>Nur PHP 4</entry> + </row> + <row> + <entry>32</entry> + <entry>E_CORE_WARNING</entry> + <entry> + Warnungen (keine schweren Fehler) während dem Start von PHP + </entry> + <entry>Nur PHP 4</entry> + </row> + <row> + <entry>64</entry> + <entry>E_COMPILE_ERROR</entry> + <entry>Schwere Fehler während des Kompilierens</entry> + <entry>Nur PHP 4</entry> + </row> + <row> + <entry>128</entry> + <entry>E_COMPILE_WARNING</entry> + <entry>Warnungen (keine schweren Fehler) während des Kompilierens</entry> + <entry>Nur PHP 4</entry> + </row> + <row> + <entry>256</entry> + <entry>E_USER_ERROR</entry> + <entry>Vom Benutzer erzeugte Fehlermeldung</entry> + <entry>Nur PHP 4</entry> + </row> + <row> + <entry>512</entry> + <entry>E_USER_WARNING</entry> + <entry>Vom Benutzer erzeugte Warnung</entry> + <entry>Nur PHP 4</entry> + </row> + <row> + <entry>1024</entry> + <entry>E_USER_NOTICE </entry> + <entry>Vom Benutzer erzeugte Mitteilungen</entry> + <entry>Nur PHP 4</entry> + </row> + <row> + <entry></entry> + <entry>E_ALL</entry> + <entry>Alle der oben genannten, welche unterstützt werden</entry> + <entry></entry> + </row> + </tbody> + </tgroup> + </table> + </para> <para> - Es gibt 4 verschiedene Arten von Fehlermeldungen und Warnungen in PHP. - Das sind: + Aus den obigen Werten (numerisch oder symbolisch) wird eine Bitmaske + erstellt, welche die zu meldenden Fehler angibt. Sie können die + <link linkend="language.operators.bitwise">Bit-Operatoren</link> + verwenden um diese Werte zu kombinieren, oder um bestimmte Fehlertypen + auszunehmen. Beachten Sie, dass innerhalb der <filename>php.ini</filename> + nur '|', '~', '!', und '&' erkannt werden, und dass innerhalb der + <filename>php3.ini</filename> keine Bit-Operatoren möglich sind. + </para> + <para> + In PHP 4 ist die Standardeinstellung für <link + linkend="ini.error-reporting">error_reporting</link> + <literal>E_ALL & ~E_NOTICE</literal>, d.h. es werden abgesehen vom + E_NOTICE-Level alle Fehler und Warnungen angezeigt. In PHP 3 ist die + Standardeinstellung <literal>(E_ERROR | E_WARNING | E_PARSE)</literal>, + was das gleiche bedeutet. Beachten Sie, dass in der + <filename>php3.ini</filename> von PHP 3 keine Konstanten unterstützt + werden, d.h. die Einstellungen von <link + linkend="ini.error-reporting">error_reporting</link> müssen numerisch + angegeben werden, in diesem Fall <literal>7</literal>. + </para> + + <para> + Die Anfangseinstellung kann in der ini Datei mittels der <link + linkend="ini.error-reporting">error_reporting</link> Direktive, + sowie in Ihrer Apache <filename>httpd.conf</filename> Datei mittels + der php_error_reporting (php3_error_reporting in PHP 3) Direktive + geändert werden. Sie kann aber auch während der Laufzeit innerhalb + eines Skriptes mittels der Funktion + <function>error_reporting</function> gesetzt werden. + </para> + + <warning> + <para> + Während eines Upgrades Ihres Codes oder Servers von PHP 3 auf PHP 4 + sollten Sie diese Einstellungen und Aufrufe von + <function>error_reporting</function> kontrollieren, sonst könnten + Sie die Meldung neuer Fehlertypen, speziell E_COMPILE_ERROR, + deaktivieren. Dies könnte dazu fühen, dass Sie ein leeres Dokument + ohne jeden Hinweis auf die Ursache des Problems erhalten. + </para> + </warning> + + <para> + All <link linkend="language.expressions">PHP expressions</link> can + also be called with the "@" prefix, which turns off error reporting + for that particular expression. If an error occurred during such + an expression and the <link + linkend="ini.track-errors">track_errors</link> feature is enabled, + you can find the error message in the global variable + <literal>$php_errormsg</literal>. + </para> + + <note> + <para> + The <link linkend="language.operators.errorcontrol">@ + error-control operator</link> prefix will not disable messages + that are the result of parse errors. + </para> + </note> + + <warning> + <para> + Currently the <link linkend="language.operators.errorcontrol">@ + error-control operator</link> prefix will even disable error + reporting for critical errors that will terminate script + execution. Among other things, this means that if you use <link + linkend="language.operators.errorcontrol">@</link> to suppress + errors from a certain function and either it isn't available or + has been mistyped, the script will die right there with no + indication as to why. + </para> + </warning> + + <para> + Below we can see an example of using the error handling capabilities in + PHP. We define a error handling function which logs the information into + a file (using an XML format), and e-mails the developer in case a critical + error in the logic happens. + <example> + <title>Using error handling in a script</title> + <programlisting role="php"> +<![CDATA[ +<?php +// we will do our own error handling +error_reporting(0); + +// user defined error handling function +function userErrorHandler ($errno, $errmsg, $filename, $linenum, $vars) { + // timestamp for the error entry + $dt = date("Y-m-d H:i:s (T)"); + + // define an assoc array of error string + // in reality the only entries we should + // consider are 2,8,256,512 and 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" + ); + // set of errors for which a var trace will be saved + $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"; + + // for testing + // echo $err; - <itemizedlist> - <listitem><simpara>1 - Normale Funktionsfehler</simpara></listitem> - <listitem><simpara>2 - Normale Warnungen</simpara></listitem> - <listitem><simpara>4 - Parser-Fehler</simpara></listitem> - <listitem><simpara>8 - Mitteilungen (Warnungen, die ignoriert werden - können, die aber eventuell auf einen Fehler im Code schließen lassen.) - </simpara></listitem> - </itemizedlist></para> - - <simpara> - Die oben aufgeführten Fehlernummern werden addiert, um den Fehlerlevel - festzulegen. Der standardmäßige Wert ist 7, d.h. 1 + 2 + 4 oder, anders - ausgedrückt, es werden alle Fehlermeldungen außer den Mitteilungen - ausgegeben. Der Fehlerlevel kann in der Konfigurationsdatei php3.ini - durch die Option error_reporting gesetzt werden. - Es ist auch möglich, den Fehlerlevel in der Apache-Konfigurationsdatei - httpd.conf durch die Option php3_error_reporting oder zur Laufzeit - durch ein Skript, das die Funktion <function>error_reporting</function> - nutzt, zu setzen.</simpara> - - <simpara> - Alle <link linkend="language.expressions">PHP-Funktionen</link> können auch mit - vorangestelltem "@" aufgerufen werden. Das bewirkt das Unterdrücken der - Fehlermeldung für die Funktion. Bei auftretendem Fehler und eingeschalteter - <link linkend="ini.track-errors">track_errors</link> Option wird die - entsprechende Fehlermeldung in der globalen Variablen $php_errormsg - gespeichert.</simpara> + // save to the error log, and e-mail me if there is a critical user error + 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"); + +// undefined constant, generates a warning +$t = I_AM_NOT_DEFINED; + +// define some "vectors" +$a = array(2,3,"foo"); +$b = array(5.5, 4.3, -1.6); +$c = array (1,-3); + +// generate a user error +$t1 = distance($c,$b)."\n"; + +// generate another user error +$t2 = distance($b,"i am not an array")."\n"; + +// generate a warning +$t3 = distance($a,$b)."\n"; + +?> +]]> + </programlisting> + </example> + This is just a simple example showing how to use the + <link linkend="ref.errorfunc">Error Handling and Logging + functions</link>. + </para> + + <para> + See also <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> @@ -47,9 +312,12 @@ sgml-indent-data:t indent-tabs-mode:nil sgml-parent-document:nil -sgml-default-dtd-file:"../manual.ced" +sgml-default-dtd-file:"../../manual.ced" sgml-exposed-tags:nil sgml-local-catalogs:nil sgml-local-ecat-files:nil End: +vim600: syn=xml fen fdm=syntax fdl=2 si +vim: et tw=78 syn=sgml +vi: ts=1 sw=1 -->