1
0
mirror of https://github.com/php/doc-de.git synced 2026-04-27 08:58:17 +02:00
Files
archived-doc-de/reference/errorfunc/functions/set-error-handler.xml
T
2008-05-22 12:54:23 +00:00

393 lines
13 KiB
XML

<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.8 $ -->
<!-- EN-Revision: 1.38 Maintainer: nobody Status: ready -->
<refentry xml:id="function.set-error-handler" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>set_error_handler</refname>
<refpurpose>Bestimmt eine benutzerdefinierte Funktion zur Fehlerbehandlung.</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>mixed</type><methodname>set_error_handler</methodname>
<methodparam><type>callback</type><parameter>Fehlerbehandlung</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>Fehlertypen</parameter></methodparam>
</methodsynopsis>
<para>
Setzt eine benutzerdefinierte Funktion
(<parameter>Fehlerbehandlung</parameter>) um Fehler in einem Skript zu
behandeln.
</para>
<para>
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>
Es ist wichtig nicht zu vergessen, dass die standardmässige
PHP-Fehlerbehandlung vollkommen umgangen wird. 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. Es ist besonders zu beachten, dass dieser Wert 0 sein wird, falls
die Anweisung, die den Fehler verursacht hat, mit dem <link
linkend="language.operators.errorcontrol">@ Fehler-Kontroll-Operator</link>
versehen ist.
</para>
<para>
Beachten Sie auch, dass Sie dafür zuständig sind, bei Bedarf
<function>die</function> aufzurufen. Nach der Funktion für die
Fehlerbehandlung wird die Ausführung des Skripts bei der Anweisung
fortgesetzt, die auf die Fehler verursachende Anweisung folgt.
</para>
<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>,
<constant>E_COMPILE_WARNING</constant> und die meisten
<constant>E_STRICT</constant>, die in der Datei ausgelöst werden, in der
<function>set_error_handler</function> aufgerufen wird.
</para>
<para>
Falls Fehler auftreten, bevor das Skript ausgeführt wird (z.B. beim
Hochladen von Dateien), kann eine benutzerdefinierte Fehlerbehandlung nicht
aufgerufen werden, weil sie zu diesem Zeitpunkt noch nicht registriert ist.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>Fehlerbehandlung</parameter></term>
<listitem>
<para>
Die benutzerdefinierte Funktion erwartet notwendig zwei Parameter: den
Fehlercode und eine Zeichenkette, die den Fehler beschreibt. Zudem gibt
es drei optionale Parameter, die übergeben werden können: 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). Die Funktion lässt sich wie folgt darstellen:
</para>
<para>
<methodsynopsis>
<methodname><replaceable>handler</replaceable></methodname>
<methodparam><type>int</type><parameter>Fehlercode</parameter></methodparam>
<methodparam><type>string</type><parameter>Fehlertext</parameter></methodparam>
<methodparam choice="opt"><type>string</type><parameter>Fehlerdatei</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>Fehlerzeile</parameter></methodparam>
<methodparam choice="opt"><type>array</type><parameter>Fehlerkontext</parameter></methodparam>
</methodsynopsis>
<variablelist>
<varlistentry>
<term><parameter>Fehlercode</parameter></term>
<listitem>
<simpara>
Die Stufe des ausgelösten Fehlers als Ganzzahl.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>Fehlertext</parameter></term>
<listitem>
<simpara>
Die Fehlermeldung als Zeichenkette.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>Fehlerdatei</parameter></term>
<listitem>
<simpara>
Der Name der Datei, in der der Fehler verursacht wurde, als
Zeichenkette. Dieser Parameter ist optional.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>Fehlerzeile</parameter></term>
<listitem>
<simpara>
Die Nummer der Zeile, in der der Fehler verursacht wurde, als
Ganzzahl. Dieser Parameter ist optional.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>Fehlerkontext</parameter></term>
<listitem>
<simpara>
Ein Array, das auf die Stelle der aktiven Symboltabelle zeigt, die
den Fehler verursacht hat. Mit anderen Worten:
<parameter>Fehlerkontext</parameter> enthält ein Array mit allen
Variablen, die im Fehler auslösenden Bereich existierten. Die
benutzerdefinierte Fehlerbehandlung darf den Fehlerkontext nicht
verändern. Dieser Parameter ist optional.
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
Falls diese Funktion &false; zurückgibt, macht die normale
Fehlerbehandlung weiter.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>Fehlertypen</parameter></term>
<listitem>
<para>
Kann genauso verwendet werden, wie die Konfigurationseinstellung <link
linkend="ini.error-reporting">error_reporting</link>, die bestimmt,
welche Fehler angezeigt werden, um das Auslösen der Funktion
<parameter>Fehlerbehandlung</parameter> zu maskieren. Wird diese Maske
nicht gesetzt, wird <parameter>Fehlerbehandlung</parameter> unabhängig
vom Wert der Einstellung <link
linkend="ini.error-reporting">error_reporting</link> bei jedem Fehler
ausgelöst.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Gibt eine Zeichenkette zurück, die die zuvor definierte
Fehlerbehandlungsroutine enthält (falls eine definiert wurde) oder &false;,
falls ein Fehler auftrat. Falls die vorherige Behandlungsroutine eine
Klassenmethode war, gibt diese Funktion ein indiziertes Array mit der
Klasse und dem Namen der Methode zurück.
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>5.2.0</entry>
<entry>
Die Fehlerbehandlung muss &false; zurückgeben um <link
linkend="reserved.variables.phperrormsg">$php_errormsg</link> zu
füllen.
</entry>
</row>
<row>
<entry>5.0.0</entry>
<entry>
Den Parameter <parameter>Fehlertypen</parameter> hinzugefügt.
</entry>
</row>
<row>
<entry>4.3.0</entry>
<entry>
Anstelle eines Funktionsnamens kann auch ein Array, das eine Referenz
auf ein Objekt und einen Methodennamen enthält, als
<parameter>Fehlerbehandlung</parameter> übergeben werden.
</entry>
</row>
<row>
<entry>4.0.2</entry>
<entry>
Drei optionale Parameter für die Benutzerfunktion
<parameter>Fehlerbehandlung</parameter> hinzugefügt: den Dateinamen,
die Zeilennummer und den Kontext.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Fehlerbehandlung mit <function>set_error_handler</function> und <function>trigger_error</function></title>
<para>
Das untenstehende Beispiel zeigt die Behandlung von internen Ausnahmen,
indem Fehler ausgelöst und durch eine benutzerdefinierte Funktion
behandelt werden:
</para>
<programlisting role="php">
<![CDATA[
<?php
// Fehlerbehandlungsfunktion
function myErrorHandler($fehlercode, $fehlertext, $fehlerdatei, $fehlerzeile)
{
switch ($fehlercode) {
case E_USER_ERROR:
echo "<b>Mein FEHLER</b> [$fehlercode] $fehlertext<br />\n";
echo " Fataler Fehler in Zeile $fehlerzeile in der Datei $fehlerdatei";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
echo "Abbruch...<br />\n";
exit(1);
break;
case E_USER_WARNING:
echo "<b>Meine WARNUNG</b> [$fehlercode] $fehlertext<br />\n";
break;
case E_USER_NOTICE:
echo "<b>Mein HINWEIS</b> [$fehlercode] $fehlertext<br />\n";
break;
default:
echo "Unbekannter Fehlertyp: [$fehlercode] $fehlertext<br />\n";
break;
}
/* Damit die PHP-interne Fehlerbehandlung nicht ausgeführt wird */
return true;
}
// Funktion zum Test der Fehlerbehandlung
function logarithmisch_skalieren($vektor, $skalierung)
{
if (!is_numeric($skalierung) || $skalierung <= 0) {
trigger_error("log(x) ist für x <= 0 nicht definiert, Sie verwendeten: skalierung = $skalierung", E_USER_ERROR);
}
if (!is_array($vektor)) {
trigger_error("Fehlerhafter Eingabevektor, es wird ein Wertearray erwartet", E_USER_WARNING);
return null;
}
$temp = array();
foreach($vektor as $pos => $wert) {
if (!is_numeric($wert)) {
trigger_error("Der Wert an Position $pos ist keine Zahl, verwende 0 (Null)", E_USER_NOTICE);
$wert = 0;
}
$temp[$pos] = log($skalierung) * $wert;
}
return $temp;
}
// auf die benutzerdefinierte Fehlerbehandlung umstellen
$alter_error_handler = set_error_handler("myErrorHandler");
// ein paar Fehler auslösen, zuerst wird ein gemischtes Array mit einem
// nichtnumerischen Eintrag definiert
echo "Vektor a\n";
$a = array(2, 3, "foo", 5.5, 43.3, 21.11);
print_r($a);
// ein zweites Array erzeugen
echo "----\nVektor b - ein Hinweis (b = log(PI) * a)\n";
/* Der Wert an Position $pos ist keine Zahl, verwende 0 (Null) */
$b = logarithmisch_skalieren($a, M_PI);
print_r($b);
// das gibt Ärger: statt eines Arrays wird eine Zeichenkette übergeben
echo "----\nVektor c - eine Warnung\n";
/* Fehlerhafter Eingabevektor, es wird ein Wertearray erwartet */
$c = logarithmisch_skalieren("kein Array", 2.3);
var_dump($c); // NULL
// dies ist ein kritischer Fehler: log ist für Null oder negative Werte
// nicht definiert
echo "----\nVektor d - ein fataler Fehler\n";
/* log(x) ist für x <= 0 nicht definiert, Sie verwendeten: skalierung = $skalierung */
$d = logarithmisch_skalieren($a, -2.5);
var_dump($d); // wird nie erreicht
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
Vektor a
Array
(
[0] => 2
[1] => 3
[2] => foo
[3] => 5.5
[4] => 43.3
[5] => 21.11
)
----
Vektor b - ein Hinweis (b = log(PI) * a)
<b>Mein HINWEIS</b> [1024] Der Wert an Position 2 ist keine Zahl, verwende 0 (Null)<br />
Array
(
[0] => 2.2894597716988
[1] => 3.4341896575482
[2] => 0
[3] => 6.2960143721717
[4] => 49.566804057279
[5] => 24.165247890281
)
----
Vektor c - eine Warnung
<b>Meine WARNUNG</b> [512] Fehlerhafter Eingabevektor, es wird ein Wertearray erwartet<br />
NULL
----
Vektor d - ein fataler Fehler
<b>Mein FEHLER</b> [256] log(x) ist für x <= 0 nicht definiert, Sie verwendeten: skalierung = -2.5<br />
Fataler Fehler in Zeile 35 in der Datei trigger_error.php, PHP 5.2.1 (FreeBSD)<br />
Abbruch...<br />
]]>
</screen>
</example>
</para>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>error_reporting</function></member>
<member><function>restore_error_handler</function></member>
<member><function>trigger_error</function></member>
<member><link linkend="errorfunc.constants">Konstanten für die Fehlerstufen</link></member>
<member>&seealso.callback;</member>
</simplelist>
</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
-->