1
0
mirror of https://github.com/php/doc-de.git synced 2026-03-29 10:42:12 +02:00
Files
archived-doc-de/reference/errorfunc/functions/set-error-handler.xml
Cornelia Boenigk 786f365323 erste Uebersetzung
git-svn-id: https://svn.php.net/repository/phpdoc/de/trunk@149861 c90b9560-bf6c-de11-be94-00142212c4b1
2004-01-27 01:13:59 +00:00

242 lines
7.7 KiB
XML

<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.4 $ -->
<refentry id="function.set-error-handler">
<refnamediv>
<refname>set_error_handler</refname>
<refpurpose>
Bestimmt eine benutzerdefinierte Funktion zur Fehlerbehandlung.
</refpurpose>
</refnamediv>
<refsect1>
<title>Beschreibung</title>
<methodsynopsis>
<type>string</type><methodname>set_error_handler</methodname>
<methodparam><type>callback</type><parameter>error_handler</parameter></methodparam>
</methodsynopsis>
<para>
Setzt eine benutzerdefinierte Funktion (<parameter>error_handler</parameter>)
um Fehler in einem Skript zu bearbeiten. Die Funktion gibt die
zuvor benutzte Fehlerbehandlungsroutine (falls eine definiert
wurde) zurück oder &false;, falls ein Fehler auftrat. Mit dieser
Funktion können Sie Ihre eigene Behandlung von Laufzeitfehlern
definieren, beispielsweise in Anwendungen, die bei einem
kritischen Fehler die Löschung von Daten bzw. Dateien erfordert
oder wenn es nötig ist, unter bestimmten Bedingungen (mit
der Funktion <function>trigger_error</function>) eine
Fehlermeldung zu generieren.
</para>
<para>
Die benutzerdefinierte Funktion erwartet notwendig zwei Parameter:
den Fehlercode und eine Beschreibung des Fehlers als String. Ab PHP
4.0.2 sind zudem drei optionale Parameter verfügbar: der Name der
Datei, in der der Fehler auftrat, die Nummer der Zeile, in der der
Fehler auftrat und der Kontext, in welchem der Fehler auftrat (ein
Array, das auf den Punkt in der aktiven Symboltabelle verweist, wo
der Fehler auftrat).
</para>
<note>
<simpara>
Anstelle eines Funktionsnamens kann auch ein Array, das eine
Referenz auf ein Objekt und einen Methodennamen enthält, übergeben
werden. (Seit PHP 4.3.0)
</simpara>
</note>
<note>
<para>
Die folgenden Fehlertypen können nicht von einer
benutzerdefinierten Funktion behandelt werden:
<constant>E_ERROR</constant>, <constant>E_PARSE</constant>,
<constant>E_CORE_ERROR</constant>, <constant>E_CORE_WARNING</constant>,
<constant>E_COMPILE_ERROR</constant> und <constant>E_COMPILE_WARNING</constant>.
</para>
</note>
<para>
Das untenstehende Beispiel zeigt die Behandlung von internen
Ausnahmen, indem eine Fehlermeldung und die Behandlung des Fehlers
durch eine benutzerdefinierte Funktion ausgelöst wird:
<example>
<title>
Fehlerbehandlung mit <function>set_error_handler</function> und
<function>trigger_error</function>
</title>
<programlisting role="php">
<![CDATA[
<?php
// umdefinieren der Konstanten - nur in PHP 4
define("FATAL", E_USER_ERROR);
define("ERROR", E_USER_WARNING);
define("WARNING", E_USER_NOTICE);
// die Stufe für dieses Skript einstellen
error_reporting(FATAL | ERROR | WARNING);
// Fehlerbehandlungsfunktion
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
switch ($errno) {
case FATAL:
echo "<b>FATAL</b> [$errno] $errstr<br />\n";
echo " Fatal error in line $errline of file $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
echo "Aborting...<br />\n";
exit(1);
break;
case ERROR:
echo "<b>ERROR</b> [$errno] $errstr<br />\n";
break;
case WARNING:
echo "<b>WARNING</b> [$errno] $errstr<br />\n";
break;
default:
echo "Unkown error type: [$errno] $errstr<br />\n";
break;
}
}
// Funktion zum Test der Fehlerbehandlung
function scale_by_log($vect, $scale)
{
if (!is_numeric($scale) || $scale <= 0) {
trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale",
FATAL);
}
if (!is_array($vect)) {
trigger_error("Incorrect input vector, array of values expected", ERROR);
return null;
}
for ($i=0; $i<count($vect); $i++) {
if (!is_numeric($vect[$i]))
trigger_error("Value at position $i is not a number, using 0 (zero)",
WARNING);
$temp[$i] = log($scale) * $vect[$i];
}
return $temp;
}
// auf die benutzerdefinierte Fehlerbehandlung umstellen
$old_error_handler = set_error_handler("myErrorHandler");
// einige Fehler auslösen, zuerst wird ein gemischtes Array
// definiert mit einem nichtnummerischen Eintrag
echo "vector a\n";
$a = array(2, 3, "foo", 5.5, 43.3, 21.11);
print_r($a);
// ein zweites Array erzeugen, das Warnungen generiert
echo "----\nvector b - a warning (b = log(PI) * a)\n";
$b = scale_by_log($a, M_PI);
print_r($b);
// hier ist der Grund für das Problem: anstatt einem Array
// wird ein String übergeben
echo "----\nvector c - an error\n";
$c = scale_by_log("not array", 2.3);
var_dump($c);
// dies ist ein kritischer Fehler, der log() ist für null
// oder negative Werte nicht definiert
echo "----\nvector d - fatal error\n";
$d = scale_by_log($a, -2.5);
?>
]]>
</programlisting>
<para>
Wenn Sie dieses Skript ausführen, erhalten Sie die folgende Ausgabe:
</para>
<screen>
<![CDATA[
vector a
Array
(
[0] => 2
[1] => 3
[2] => foo
[3] => 5.5
[4] => 43.3
[5] => 21.11
)
----
vector b - a warning (b = log(PI) * a)
<b>WARNING</b> [1024] Value at position 2 is not a number, using 0 (zero)<br />
Array
(
[0] => 2.2894597716988
[1] => 3.4341896575482
[2] => 0
[3] => 6.2960143721717
[4] => 49.566804057279
[5] => 24.165247890281
)
----
vector c - an error
<b>ERROR</b> [512] Incorrect input vector, array of values expected<br />
NULL
----
vector d - fatal error
<b>FATAL</b> [256] log(x) for x <= 0 is undefined, you used: scale = -2.5<br />
Fatal error in line 36 of file trigger_error.php, PHP 4.0.2 (Linux)<br />
Aborting...<br />
]]>
</screen>
</example>
</para>
<para>
Es ist wichtig und darf nicht vergessen werden, dass die
standardmässige PHP Fehlerbehandlung vollkommen umgangen wurde. Die
Einstellungen der Funktion <function>error_reporting</function>
haben keine Auswirkung und Ihre eigene Fehlerbehandlungsroutine
wird ohne Rücksicht darauf aufgerufen. Sie können jedoch immer noch
den aktuellen Wert von <link linkend="ini.error-reporting">error_reporting</link>
lesen und entsprechend handeln. Von besonderer Bedeutung ist, dass
dieser Wert 0 sein wird, falls der Befehl, der den Fehler verurscht
hat, mit dem
<link linkend="language.operators.errorcontrol">@ error-control operator</link> versehen ist.
</para>
<para>
Beachten Sie auch, dass Sie <function>die</function> aufrufen
können, wenn es notwendig ist. Wenn die Fehlerbehandlungsfunktion
zurückkehrt, wird die Ausführung des Skripts beim nächsten Befehl
nach dem fehlerverursachenden Befehl fortgesetzt.
</para>
<note>
<para>
Falls Fehler auftreten, bevor das Skript ausgeführt wird (z. B.
bei Dateiuploads), kann eine benutzerdefinierte Fehlerbehandlung
nicht aufgerufen werden, weil sie zu diesem Zeitpunkt noch nicht
registriert ist.
</para>
</note>
<para>
Siehe auch <function>error_reporting</function>,
<function>restore_error_handler</function>,
<function>trigger_error</function>, und
<link linkend="errorfunc.constants">error level constants</link>.
</para>
</refsect1>
</refentry>
<!-- 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:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->