Suche…


Einstellen der Fehlerberichterstattung und Angabe, wo sie angezeigt werden sollen

Wenn dies in php.ini noch nicht geschehen ist, kann die Fehlerberichterstattung dynamisch festgelegt werden und sollte so eingestellt sein, dass die meisten Fehler angezeigt werden:

Syntax

int error_reporting ([ int $level ] )

Beispiele

// should always be used prior to 5.4
error_reporting(E_ALL);

// -1 will show every possible error, even when new levels and constants are added 
// in future PHP versions. E_ALL does the same up to 5.4.
error_reporting(-1);

// without notices
error_reporting(E_ALL & ~E_NOTICE);

// only warnings and notices.
// for the sake of example, one shouldn't report only those
error_reporting(E_WARNING | E_NOTICE);

Fehler werden standardmäßig von PHP protokolliert, normalerweise in einer Datei error.log auf derselben Ebene wie das ausgeführte Skript.

In der Entwicklungsumgebung kann man sie auch auf dem Bildschirm anzeigen:

ini_set('display_errors', 1);

in der Produktion sollte man jedoch

ini_set('display_errors', 0);

und zeigen Sie eine freundliche Problemmeldung durch die Verwendung eines Exception- oder Error-Handlers an.

Ausnahme- und Fehlerbehandlung

versuchen / fangen

try..catch Blöcke können verwendet werden, um den Ablauf eines Programms zu steuern, in dem Ausnahmen ausgelöst werden können. Sie können gefangen genommen und gehandhabt werden, anstatt PHP anhalten zu lassen, wenn eines auftritt:

try {
    // Do a bunch of things...
    throw new Exception('My test exception!');
} catch (Exception $ex) {
    // Your logic failed. What do you want to do about that? Log it:
    file_put_contents('my_error_log.txt', $ex->getMessage(), FILE_APPEND);
}

Das obige Beispiel catch die im try Block geworfene Ausnahme ab und protokolliert die Nachricht ("My test exception!") In einer Textdatei.

Verschiedene Ausnahmetypen abfangen

Sie können mehrere catch Anweisungen für verschiedene Ausnahmetypen implementieren, die auf unterschiedliche Weise gehandhabt werden sollen, beispielsweise:

try {
    throw new InvalidArgumentException('Argument #1 must be an integer!');
} catch (InvalidArgumentException $ex) {
    var_dump('Invalid argument exception caught: ' . $ex->getMessage());
} catch (Exception $ex) {
    var_dump('Standard exception caught: ' . $ex->getMessage());
}

Im obigen Beispiel wird der erste catch verwendet, da er in der Reihenfolge der Ausführung zuerst übereinstimmt. Wenn Sie die Reihenfolge der catch Anweisungen vertauschen, wird der Exception Catcher zuerst ausgeführt.

Wenn Sie stattdessen eine UnexpectedValueException auslösen, wird der zweite Handler für eine verwendete Standardausnahme Exception .

endlich

Wenn nach dem Ausführen eines try oder eines catch etwas getan werden muss, können Sie eine finally Anweisung verwenden:

try {
    throw new Exception('Hello world');
} catch (Exception $e) {
    echo 'Uh oh! ' . $e->getMessage();
} finally {
    echo " - I'm finished now - home time!";
}

Das obige Beispiel würde folgendes ausgeben:

Oh oh! Hallo Welt - ich bin jetzt fertig - Heimatzeit!

zu werfen

In PHP 7 sehen wir die Einführung der Throwable Schnittstelle, die sowohl Error als auch Exception implementiert. Dadurch wird in PHP 7 ein Dienstvertragsniveau zwischen Ausnahmen hinzugefügt, und Sie können die Schnittstelle für Ihre eigenen benutzerdefinierten Ausnahmen implementieren:

$handler = function(\Throwable $ex) {
    $msg = "[ {$ex->getCode()} ] {$ex->getTraceAsString()}";
    mail('[email protected]', $ex->getMessage(), $msg);
    echo myNiceErrorMessageFunction();
};
set_exception_handler($handler);
set_error_handler($handler);

Vor PHP 7 können Sie einfach den Typ Exception eingeben, da alle Exception-Klassen ab PHP 5 erweitert werden.

Protokollierung schwerwiegender Fehler

In PHP ist ein schwerwiegender Fehler eine Art Fehler, der nicht abgefangen werden kann, dh, nachdem ein schwerwiegender Fehler aufgetreten ist, wird ein Programm nicht fortgesetzt. Um diesen Fehler zu protokollieren oder den Absturz irgendwie zu handhaben, können Sie register_shutdown_function , um den Shutdown-Handler zu registrieren.

function fatalErrorHandler() {
    // Let's get last error that was fatal.
    $error = error_get_last();
   
    // This is error-only handler for example purposes; no error means that
    // there were no error and shutdown was proper. Also ensure it will handle 
    // only fatal errors.
    if (null === $error || E_ERROR != $error['type']) {
        return;
    }

    // Log last error to a log file.
    // let's naively assume that logs are in the folder inside the app folder.
    $logFile = fopen("./app/logs/error.log", "a+");

    // Get useful info out of error.
    $type    = $error["type"];
    $file    = $error["file"];
    $line    = $error["line"];
    $message = $error["message"]

    fprintf(
        $logFile,
        "[%s] %s: %s in %s:%d\n",
        date("Y-m-d H:i:s"),
        $type,        
        $message,
        $file, 
        $line);

    fclose($logFile);       
}


register_shutdown_function('fatalErrorHandler');

Referenz:



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow