PHP
Ausnahmebehandlung und Fehlerberichterstattung
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:
- http://php.net/manual/de/function.register-shutdown-function.php
- http://php.net/manual/de/function.error-get-last.php
- http://php.net/manual/de/errorfunc.constants.php