English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PHP Grundlagenanleitung

PHP Fortgeschrittene Anleitung

PHP & MySQL

PHP Referenzhandbuch

PHP-Fehlerbehandlung

In diesem Tutorial werden Sie lernen, wie Sie PHP-Fehlerbehandlungsfunktionen verwenden, um Fehlerfälle elegant zu behandeln.

Fehlerbehandlung

Manchmal könnte Ihre Anwendung nicht ordnungsgemäß funktionieren und Fehler verursachen. Es gibt mehrere mögliche Ursachen für Fehler, wie z.B.:

  • Der Webserver könnte möglicherweise nicht genügend Festplattenspeicher haben

  • Der Benutzer könnte ungültige Werte in Formularfeldern eingeben

  • Das Datei- oder Datenbankprotokoll, das Sie versuchen zu erreichen, könnte nicht existieren

  • Die Anwendung hat möglicherweise keine Berechtigung, Dateien auf der Festplatte zu schreiben

  • Dienste, auf die die Anwendung zugreifen muss, könnten möglicherweise vorübergehend nicht verfügbar sein

Diese Arten von Fehlern werden als Laufzeitfehler bezeichnet, weil sie während der Ausführung des Skripts auftreten. Sie unterscheiden sich von syntaktischen Fehlern, die vor der Ausführung des Skripts behoben werden müssen.

Professionelle Anwendungen müssen über Funktionen verfügen, die solche Laufzeitfehler angemessen behandeln. Dies bedeutet in der Regel, dass Probleme klar und präzise an den Benutzer gemeldet werden.

Erfahren Sie mehr über Fehlerstufen

Normalerweise wird der PHP-Engine Fehler ausgelöst, wenn ein Problem auftritt, das das Skript nicht ordnungsgemäß ausführen lässt. Jeder Fehler wird durch einen Integerwert und eine zugehörige Konstante dargestellt. Nachfolgendes Tableau zeigt einige gängige Fehlerstufen:

FehlerstufeWertBeschreibung
E_ERROR1

Tödlicher Laufzeitfehler, der nicht behoben werden kann. Die Ausführung des Skripts wird sofort gestoppt.

E_WARNING2

Laufzeitwarnung. Sie ist nicht tödlich und die meisten Fehler gehören zu dieser Kategorie. Die Ausführung des Skripts wird nicht gestoppt.

E_NOTICE8

Laufzeitbenachrichtigung. Zeigt an, dass das Skript möglicherweise ein Problem begegnen wird, das möglicherweise zu einem Fehler führen könnte, obwohl dies auch während des normalen Skriptlaufs vorkommen kann.

E_USER_ERROR256

Benutzer generierte tödliche Fehlermeldungen. Dies ähnelt E_ERROR, aber sie werden durch den PHP-Skript mit der Funktion trigger_error() und nicht durch die PHP-Engine generiert.

E_USER_WARNING512Nicht tödliche Benutzer generierte Warnungen. Dies ähnelt E_WARNING, aber sie werden durch den PHP-Skript mit der Funktion trigger_error() und nicht durch die PHP-Engine generiert.
E_USER_NOTICE1024

Benutzer generierte Benachrichtigungsmitteilungen. Dies ähnelt E_NOTICE, aber sie werden durch den PHP-Skript mit der Funktion trigger_error() und nicht durch den PHP-Engine generiert.

E_STRICT2048

Im eigentlichen Sinne kein Fehler, aber PHP wird auf jeden Fall ausgelöst, wenn es auf Code stößt, der potenzielle Probleme oder Inkompatibilitäten verursachen könnte.

E_ALL8191

Alle Fehler und Warnungen, PHP 5.4.0 vor E_STRICT ausgenommen.

Für weitere Fehlerstufen lesen Sie bittePHP-Fehlerstufeder Referenz.

Jedes Mal, wenn ein PHP-Skript ein Problem hat, löst der PHP-Engine einen Fehler aus, aber Sie können auch selbst Fehler auslösen, um mehr benutzerfreundliche Fehlermeldungen zu generieren. So können Sie die Anwendung komplexer gestalten. Nachfolgend werden einige häufig verwendete Methoden zur Fehlerbehandlung in PHP beschrieben:

Grundlegende Fehlerbehandlung mit der Funktion die()

Bedenken Sie das folgende Beispiel, das versucht, eine Textdatei nur im Lesemodus zu öffnen.

<?php
//Versuch, eine nicht vorhandene Datei zu öffnen
$file = fopen("sample.txt", "r");
?>

Wenn die Datei nicht existiert, erhalten Sie möglicherweise die folgende Fehlermeldung:

Warnung: fopen(sample.txt) [function.fopen]: konnte Stream nicht öffnen: Kein solcher Datei oder Verzeichnis in C:\wamp\www\project\test.php auf Zeile 2

Wenn wir einige einfache Schritte befolgen, können wir verhindern, dass der Benutzer solche Fehlermeldungen erhält.

<?php
if(file_exists("sample.txt")){
    $file = fopen("sample.txt", "r");
} else {
    die("Fehler: Die Datei, auf die Sie zugreifen möchten, existiert nicht.");
}
?>

Wenn Sie den obigen Skript ausführen, erhalten Sie die folgende Fehlermeldung:

Fehler: Die Datei, auf die Sie zugreifen möchten, existiert nicht.

Wie Sie sehen können, können wir durch die Implementierung einfacher Überprüfungen vor dem Versuch, auf die Datei zuzugreifen, für den Benutzer sinnvollere Fehlermeldungen generieren.

Wenn die Datei "sample.txt" nicht gefunden wird, zeigt die oben verwendete die() -Funktion nur eine benutzerdefinierte Fehlermeldung an und beendet das aktuelle Skript.

Erstellen Sie einen benutzerdefinierten Fehlerbehandlungsprogramms

Sie können Ihre eigene Fehlerbehandlungsfunktion erstellen, um Laufzeitfehler des PHP-Engines zu verarbeiten. Eine benutzerdefinierte Fehlerbehandlung bietet Ihnen mehr Flexibilität und bessere Kontrolle über Fehler, sie kann Fehler überprüfen und entscheiden, wie sie behandelt werden sollen, sie kann eine Nachricht an den Benutzer anzeigen, den Fehler in einer Datei oder Datenbank protokollieren, per E-Mail senden, versuchen, das Problem zu beheben und fortzufahren, den Skriptausführung abbrechen oder den Fehler vollständig ignorieren.
Die Definition einer benutzerdefinierten Fehlerbehandlungsfunktion muss mindestens zwei Parameter (errno und errstr) verarbeiten können, kann jedoch zusätzliche drei Parameter (errfile, errline und errcontext) akzeptieren, wie nachfolgend beschrieben:

ParameterBeschreibung
Obligatorisch - Nachfolgende Parameter sind obligatorisch
errnoGeben Sie die Fehlerstufe als Integer an. Dies entspricht den entsprechenden Fehlerstufe-Konstanten (E_ERROR, E_WARNING usw.)
errstrGeben Sie die Fehlermeldung als String an
Optional - Nachfolgende Parameter sind optional
errfileGeben Sie den Dateinamen der Skriptdatei, in der der Fehler aufgetreten ist, als String an
errlineGeben Sie die Zeilennummer des Fehlers als String an
errcontextGeben Sie ein Array mit allen Variablen und ihren Werten an, die bei Auftreten eines Fehlers existieren. Dies ist für die Debugging-Phase nützlich

Hier ist ein einfaches Beispiel für eine benutzerdefinierte Fehlerbehandlungsfunktion. Unabhängig davon, wie klein, wird dieser Fehlerbehandlungsaufruf customError() ausgelöst, wenn ein Fehler auftritt. Dann werden die Fehlerdetails an den Browser ausgegeben und das Skript wird gestoppt.

<?php
//Fehlerbehandlungsfunktion
function customError($errno, $errstr){
    echo "<b>Error:</b> [$errno] $errstr";
}
?>

Sie müssen PHP mitteilen, dass es Ihre benutzerdefinierte Fehlerbehandlungsfunktion verwenden soll-Rufen Sie einfach die eingebauten set_error_handler() Funktion auf und übergeben Sie den Funktionsnamen weiter.

<?php
//Fehlerbehandlungsfunktion
function customError($errno, $errstr){
    echo "<b>Error:</b> [$errno] $errstr";
}
 
//Fehlerbehandlungsprogramm festlegen
set_error_handler("customError");
 
//Fehler auslösen
echo($test);
?>

Fehlerprotokollierung

Fehlermeldungen in Textdateien protokollieren

Sie können auch die detaillierten Fehlerinformationen in eine Logdatei schreiben, wie folgt:

<?php
function calcDivision($dividend, $divisor) {
    if($divisor == 0) {
        trigger_error("calcDivision(): Division durch Null ist nicht erlaubt", E_USER_WARNING);
        return false;
    } else {
        return($dividend / $divisor);
    }
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
    $message = date("Y-m-d H:i:s - ");
    Fehlermeldung .= "Error: [" . $errno . "], " . "$errstr in $errfile auf Zeile $errline, ";
    $message .= "Variablen:" . print_r($errcontext, true) . "\r\n";
    
    error_log($message, 3, "logs"/app_errors.log);
    die("Es ist ein Problem aufgetreten, bitte versuchen Sie es erneut.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "Diese Nachricht wird nie ausgegeben.";
?>

Fehlermeldungen per E-Mail senden

Sie können auch die error_log() Funktion verwenden, um E-Mails mit detaillierten Fehlerinformationen zu senden.

<?php
function calcDivision($dividend, $divisor) {
    if ($divisor == 0){
        trigger_error("calcDivision(): Division durch Null ist nicht erlaubt", E_USER_WARNING);
        return false;
    } else {
        return($dividend / $divisor);
    }
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
    $message = date("Y-m-d H:i:s - ");
    Fehlermeldung .= "Error: [" . $errno . "], " . "$errstr in $errfile auf Zeile $errline, ";
    $message .= "Variablen:" . print_r($errcontext, true) . "\r\n";
    
    error_log($message, 1, "[email protected]");
    die("Es ist ein Problem aufgetreten, bitte versuchen Sie es noch einmal. Der Fehlerbericht wurde dem Website-Administrator übermittelt.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "Dies wird niemals gedruckt werden.";
?>

Fehler auslösen

Obwohl der PHP-Engine Fehler auslöst, wenn das Skript Probleme hat, können Sie auch selbst Fehler auslösen. Dies kann helfen, Ihre Anwendung robuster zu machen, da potenzielle Probleme markiert werden können, bevor sie zu schwerwiegenden Fehlern werden.

Um einen Fehler aus dem Skript auszulösen, rufen Sie die Funktion trigger_error() auf und übergeben Sie die zu generierende Fehlermeldung:

trigger_error("Es ist ein Problem aufgetreten.");

Betrachten Sie die folgende Funktion, um die Division zweier Zahlen zu berechnen.

<?php
function calcDivision($dividend, $divisor) {
    return($dividend / $divisor);
}
 
//Funktion aufrufen
echo calcDivision(10, 0);
?>

Wenn ein Wert von null als Parameter $divisor übergeben wird, erzeugt der PHP-Engine der Fehler ähnlich dem folgenden Inhalt:

Warning: Division by zero in C:\wamp\www\project\test.php on line 3

Diese Nachricht enthält nicht viel Inhalt. Sehen Sie sich das folgende Beispiel mit der Verwendung der Funktion trigger_error() an, um einen Fehler zu erzeugen.

<?php
function calcDivision($dividend, $divisor) {
    if($divisor == 0) {
        trigger_error("Der Teiler kann nicht null sein", E_USER_WARNING);
        return false;
    } else {
        return($dividend / $divisor);
    }
}
 
//Funktion aufrufen
echo calcDivision(10, 0);
?>

Nun generiert das Skript diese Fehlermeldung:

Warning: Der Teiler kann in C:\wamp\www\project\error.php in Zeile nicht null sein 4  	

Wie Sie sehen können, stellt die Fehlermeldung des zweiten Beispiels im Vergleich zum vorherigen Beispiel das Problem klarer dar.