Frage

Nach Kommentar zu dieser Antwort es möglich ist, Schwerwiegende Fehler durch ein Abschaltfunktion , die gefangen werden können nicht set_error_handler() verwendet wird.

Allerdings konnte ich nicht herausfinden, wie zu bestimmen, ob die Abschaltung aufgrund eines schwerwiegenden Fehler aufgetreten ist oder aufgrund des Skripts erreicht sein Ende.

Darüber hinaus scheinen die Debug-Backtrace-Funktionen nicht mehr existierenden in der Shutdown-Funktion zu sein, es ist ziemlich wertlos für die Protokollierung der Stack-Trace zu machen, wo der Schwerwiegender Fehler ist aufgetreten.

Also meine Frage ist: Was ist der beste Weg auf Schwerwiegende Fehler (vor allem nicht definierte Funktion Anrufe) zu reagieren, während die Fähigkeit, halten eine richtige Backtrace erstellen

War es hilfreich?

Lösung

Dies funktioniert für mich:

function shutdown() {
    $error = error_get_last();
    if ($error['type'] === E_ERROR) {
        // fatal error has occured
    }
}

register_shutdown_function('shutdown');

spl_autoload_register('foo'); 
// throws a LogicException which is not caught, so triggers a E_ERROR

Sie jedoch wissen, dass es wahrscheinlich schon, aber nur um sicher zu machen: Sie sind nicht von einem E_ERROR in irgendeiner Weise erholen können

.

Wie für die Backtrace, kann man nicht ... :( In den meisten Fällen von einem fatalen Fehler, vor allem Undefinierte Funktion Fehler, Sie nicht wirklich brauchen es. Die Datei / Zeile Aufzeigen wo es aufgetreten ist genug. Der Backtrace in diesem Fall irrelevant ist.

Andere Tipps

Eine Möglichkeit, zwischen fatalen Fehlern und den ordnungsgemäßen Anwendung Abschaltung mit dem register_shutdown_function zu unterscheiden ist eine Konstante als die letzte Zeile des Programms zu definieren, und dann prüfen, ob die Konstante definiert ist:

function fatal_error() {
if ( ! defined(PROGRAM_EXECUTION_SUCCESSFUL)) {
        // fatal error has occurred
    }
}

register_shutdown_function('fatal_error');

define('PROGRAM_EXECUTION_SUCCESSFUL', true);

Wenn das Programm das Ende erreicht hat, kann es nicht zu einem schwerwiegenden Fehler aufgetreten ist, so wissen wir nicht, um die Funktion zu laufen, wenn die Konstante definiert ist.

error_get_last () ist ein Array mit allen Informationen über den fatalen Fehler, dass Sie debuggen benötigen sollten, obwohl es keinen Backtrace hat, wie bereits erwähnt.

Im Allgemeinen, wenn Sie Ihr PHP-Programm einen schwerwiegenden Fehler aufgetreten ist (im Gegensatz zu einer Ausnahme im Gegensatz), mögen Sie das Programm sprengen, so können Sie das Problem finden und beheben. Ich habe für Produktionsumgebungen register_shutdown_function nützlich gefunden, wo man Fehler meldet ausgeschaltet werden soll, wollen aber in gewisser Weise den Fehler im Hintergrund zu protokollieren, so dass Sie darauf reagieren können. Sie können auch die Funktion den Benutzer auf eine freundliche HTML-Seite im Falle eines solchen Fehlers zu leiten, so dass Sie nicht nur eine leere Seite dienen werden.

Gerade ein netter Trick, um die aktuelle error_handler Methode zu bekommen =)

<?php
register_shutdown_function('__fatalHandler');
function __fatalHandler()
{
    $error      = error_get_last();

    //check if it's a core/fatal error, otherwise it's a normal shutdown
    if($error !== NULL && $error['type'] === E_ERROR) {
        //Bit hackish, but the set_exception_handler will return the old handler
        function fakeHandler() { }
        $handler = set_exception_handler('fakeHandler');
        restore_exception_handler();
        if($handler !== null) { 
            call_user_func($handler, new ErrorException($error['message'], $error['type'], 0, $error['file'], $error['line']));
        }
        exit;
    }
}
?>

ich anmerken wan't auch, dass, wenn Sie anrufen

<?php
ini_set('display_errors', false);
?>

Php stoppt den Fehler anzeigt, andernfalls wird der Fehlertext an den Client gesendet wird vor Ihrer Fehlerbehandlung

Ich verwende "ob_start" für diese.

function fatal_error_handler($buffer) {
    if (preg_match("|(Fatal error:)(.+)|", $buffer, $regs) ) {
        //Your code
    }
    return $buffer;
}
ob_start("fatal_error_handler");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top