PHP Fehlerbehandlung


In PHP ist die standardmäßige Fehlerbehandlung einfach. Eine Fehlermeldung wird an den Browser gesendet, die den Dateinamen, die Zeilennummer und eine Nachricht enthält, die den Fehler beschreibt.


PHP-Fehlerbehandlung

Die Fehlerbehandlung ist ein wichtiger Teil bei der Erstellung von Skripten und Webanwendungen. Wenn es Ihrem Code an Fehlererkennungscode fehlt, wirkt das Programm unprofessionell und öffnet Sicherheitsrisiken Tür und Tor.

Dieses Tutorial stellt einige der wichtigsten Methoden zur Fehlererkennung in PHP vor.

Wir erklären Ihnen verschiedene Methoden zur Fehlerbehandlung:

  • Einfache "die()"-Anweisungen
  • Benutzerdefinierte Fehler und Fehlerauslöser
  • Fehlerberichterstattung

Grundlegende Fehlerbehandlung: Verwenden der Funktion die()

Das erste Beispiel zeigt ein einfaches Skript, das eine Textdatei öffnet:

<?php
$file=fopen("welcome.txt","r");
?>

Wenn die Datei nicht existiert, erhalten Sie einen Fehler wie diesen:

Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in /www/example/test/test.php on line 2

Um zu vermeiden, dass Benutzer eine Fehlermeldung wie die oben erhalten, prüfen wir, ob die Datei existiert, bevor wir darauf zugreifen:

<?php
if(!file_exists("welcome.txt"))
{
    die("文件不存在");
}
else
{
    $file=fopen("welcome.txt","r");
}
?>

Wenn die Datei nun nicht existiert, erhalten Sie eine Fehlermeldung wie diese:

File does not exist.

Im Vergleich zum vorherigen Code ist der obige Code effektiver, weil er einen einfachen Fehlerbehandlungsmechanismus verwendet, um das Skript nach einem Fehler zu beenden.

Allerdings ist das bloße Beenden des Skripts nicht immer der geeignete Ansatz. Untersuchen wir alternative PHP-Funktionen, die zur Fehlerbehandlung verwendet werden.


Erstellen eines benutzerdefinierten Fehlerhandlers

Das Erstellen eines benutzerdefinierten Fehlerhandlers ist sehr einfach. Wir erstellen einfach eine dedizierte Funktion, die aufgerufen werden kann, wenn in PHP ein Fehler auftritt.

Die Funktion muss mindestens zwei Parameter verarbeiten können (Fehlerstufe und Fehlermeldung), kann aber bis zu fünf Parameter akzeptieren (optional: Datei, Zeilennummer und Fehlerkontext):

Syntax

error_function(error_level,error_message,
error_file,error_line,error_context)
Parameter Beschreibung
error_level Erforderlich. Gibt die Fehlerberichtsstufe für den benutzerdefinierten Fehler an. Muss eine Zahl sein. Siehe die Tabelle unten: Fehlerberichtsstufen.
error_message Erforderlich. Gibt die Fehlermeldung für den benutzerdefinierten Fehler an.
error_file Optional. Gibt den Dateinamen an, in dem der Fehler aufgetreten ist.
error_line Optional. Gibt die Zeilennummer an, in der der Fehler aufgetreten ist.
error_context Optional. Gibt ein Array an, das jede Variable und ihre Werte enthält, die zum Zeitpunkt des Fehlers verwendet wurden.

Fehlerberichtsebenen

Diese Fehlerberichtsstufen sind die verschiedenen Fehlerarten, die vom benutzerdefinierten Fehlerhandler behandelt werden:

Wert Konstante Beschreibung
2 E_WARNING Nicht fatale Laufzeitfehler. Sie halten die Skriptausführung nicht an.
8 E_NOTICE Laufzeithinweise. Treten auf, wenn das Skript einen möglichen Fehler erkennt, können aber auch auftreten, wenn das Skript normal läuft.
256 E_USER_ERROR Fatale benutzergenerierte Fehler. Diese ähneln E_ERROR, das vom Programmierer mithilfe der PHP-Funktion trigger_error() gesetzt wird.
512 E_USER_WARNING Nicht schwerwiegende, benutzergenerierte Warnungen. Diese ähneln E_WARNING, das vom Programmierer mit der PHP-Funktion trigger_error() gesetzt wird.
1024 E_USER_NOTICE Benutzergenerierte Hinweise. Diese ähneln E_NOTICE, das vom Programmierer mit der PHP-Funktion trigger_error() gesetzt wird.
4096 E_RECOVERABLE Abfangbare fatale Fehler. Ähnlich wie E_ERROR, können aber von einem benutzerdefinierten Handler abgefangen werden. (Siehe set_error_handler())
8191 E_ALL Alle Fehler und Warnungen. (In PHP 5.4 wurde E_STRICT Teil von E_ALL.)

Nun erstellen wir eine Funktion, die Fehler behandelt:

function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr<br>";
    echo "脚本结束";
    die();
}

Der obige Code ist eine einfache Fehlerbehandlungsfunktion. Wenn sie ausgelöst wird, nimmt sie die Fehlerstufe und die Fehlermeldung entgegen. Dann gibt sie die Fehlerstufe und die Meldung aus und beendet das Skript.

Nachdem wir nun eine Fehlerbehandlungsfunktion erstellt haben, müssen wir festlegen, wann diese Funktion ausgelöst werden soll.


Festlegen des Fehlerhandlers

PHPs Standard-Fehlerhandler ist der integrierte Fehlerhandler. Wir beabsichtigen, die obige Funktion während der Skriptausführung zum Standard-Fehlerhandler zu machen.

Der Fehlerhandler kann so geändert werden, dass er nur für bestimmte Fehler gilt, wodurch das Skript verschiedene Fehler auf unterschiedliche Weise behandeln kann. In diesem Beispiel möchten wir jedoch unseren benutzerdefinierten Fehlerhandler für alle Fehler verwenden:

set_error_handler("customError");

Da unsere benutzerdefinierte Funktion alle Fehler behandeln soll, benötigt set_error_handler() nur einen Parameter. Ein zweiter Parameter kann hinzugefügt werden, um die Fehlerstufe anzugeben.

Beispiel

Testen Sie diesen Fehlerhandler, indem Sie versuchen, eine Variable auszugeben, die nicht existiert:

<?php
// 错误处理函数
function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr";
}

// 设置错误处理函数
set_error_handler("customError");

// 触发错误
echo($test);
?>

Die Ausgabe des obigen Codes ist unten dargestellt:

Error: [8] Undefined variable: test


Fehler auslösen

An Stellen im Skript, an denen Benutzerdaten eingegeben werden, ist es nützlich, Fehler auszulösen, wenn die Eingabe des Benutzers ungültig ist. In PHP wird diese Aufgabe von der Funktion trigger_error() übernommen.

Beispiel

In diesem Beispiel tritt ein Fehler auf, wenn die Variable "test" größer als "1" ist:

<?php
$test=2;
if ($test>1)
{
    trigger_error("变量值必须小于等于 1");
}
?>

Die Ausgabe des obigen Codes ist unten dargestellt:

Notice: 变量值必须小于等于 1
in /www/test/example.php on line 5

Sie können Fehler überall in Ihrem Skript auslösen. Durch Hinzufügen des zweiten Parameters können Sie den Typ des ausgelösten Fehlers angeben.

Mögliche Fehlertypen:

  • E_USER_ERROR - Fataler, vom Benutzer erzeugter Laufzeitfehler. Von diesem Fehler kann nicht wiederhergestellt werden. Die Skriptausführung wird unterbrochen.
  • E_USER_WARNING - Nicht fatale, vom Benutzer erzeugte Laufzeitwarnung. Die Skriptausführung wird nicht unterbrochen.
  • E_USER_NOTICE - Standard. Vom Benutzer erzeugter Laufzeithinweis. Tritt auf, wenn das Skript einen möglichen Fehler erkennt, kann aber auch auftreten, wenn das Skript normal ausgeführt wird.

Beispiel

In diesem Beispiel tritt ein E_USER_WARNING-Fehler auf, wenn die Variable "test" größer als "1" ist. Wenn ein E_USER_WARNING auftritt, verwenden wir unseren benutzerdefinierten Fehlerhandler und beenden das Skript:

<?php
// 错误处理函数
function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr<br>";
    echo "脚本结束";
    die();
}

// 设置错误处理函数
set_error_handler("customError",E_USER_WARNING);

// 触发错误
$test=2;
if ($test>1)
{
    trigger_error("变量值必须小于等于 1",E_USER_WARNING);
}
?>

Die Ausgabe des obigen Codes ist unten dargestellt:

Error: [512] 变量值必须小于等于 1
脚本结束

Nachdem wir nun gelernt haben, wie man eigene Fehler erstellt und auslöst, sehen wir uns als Nächstes die Fehlerprotokollierung an.


Fehlerprotokollierung

Standardmäßig sendet PHP, abhängig von der error_log-Konfiguration in php.ini, Fehlerprotokolle an das Protokollierungssystem des Servers oder an eine Datei. Mithilfe der Funktion error_log() können Sie Fehlerprotokolle an eine angegebene Datei oder ein entferntes Ziel senden.

Fehlermeldungen per E-Mail an sich selbst zu senden, ist eine gute Möglichkeit, über bestimmte Fehler benachrichtigt zu werden.

Fehlermeldungen per E-Mail senden

Im folgenden Beispiel senden wir bei Auftreten eines bestimmten Fehlers eine E-Mail mit der Fehlermeldung und beenden das Skript:

<?php
// 错误处理函数
function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr<br>";
    echo "已通知网站管理员";
    error_log("Error: [$errno] $errstr",1,
    "[email protected]","From: [email protected]");
}

// 设置错误处理函数
set_error_handler("customError",E_USER_WARNING);

// 触发错误
$test=2;
if ($test>1)
{
    trigger_error("变量值必须小于等于 1",E_USER_WARNING);
}
?>

Die Ausgabe des obigen Codes ist unten dargestellt:

Error: [512] 变量值必须小于等于 1
已通知网站管理员

Die vom obigen Code empfangene E-Mail wird unten angezeigt:

Error: [512] 变量值必须小于等于 1

Diese Methode ist nicht für alle Fehler geeignet. Reguläre Fehler sollten auf dem Server mit dem standardmäßigen PHP-Protokollierungssystem protokolliert werden.

Andere Erweiterungen