PHP
Obsługa wyjątków i raportowanie błędów
Szukaj…
Ustawianie raportowania błędów i miejsce ich wyświetlania
Jeśli nie zostało to jeszcze zrobione w php.ini, raportowanie błędów można ustawić dynamicznie i powinno być ustawione, aby umożliwić wyświetlanie większości błędów:
Składnia
int error_reporting ([ int $level ] )
Przykłady
// 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);
błędy będą domyślnie rejestrowane przez php, zwykle w pliku error.log na tym samym poziomie, co uruchomiony skrypt.
w środowisku programistycznym można je również wyświetlić na ekranie:
ini_set('display_errors', 1);
jednak w produkcji należy
ini_set('display_errors', 0);
i pokaż przyjazny komunikat o problemie za pomocą obsługi wyjątków lub błędów.
Obsługa wyjątków i błędów
próbuj złapać
Bloki try..catch
można wykorzystać do sterowania przepływem programu, w którym mogą być zgłaszane wyjątki . Można je złapać i obsłużyć z wdziękiem, zamiast pozwalać PHP zatrzymać się, gdy się napotka:
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);
}
Powyższy przykład catch
wyjątek zgłoszony w bloku try
i rejestruje jego komunikat („Mój wyjątek testowy!”) W pliku tekstowym.
Łapanie różnych typów wyjątków
Można zaimplementować wiele instrukcji catch
dla różnych typów wyjątków, które mają być obsługiwane na różne sposoby, na przykład:
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());
}
W powyższym przykładzie użyty zostanie pierwszy catch
, ponieważ pasuje on pierwszy w kolejności wykonania. Jeśli zamienisz kolejność instrukcji catch
, łapacz Exception
wykona się jako pierwszy.
Podobnie, jeśli zamiast tego wyrzucisz Exception
UnexpectedValueException
, zobaczysz, że używany jest drugi moduł obsługi standardowego Exception
.
Wreszcie
Jeśli potrzebujesz czegoś do zrobienia po zakończeniu try
lub catch
, możesz użyć instrukcji w finally
:
try {
throw new Exception('Hello world');
} catch (Exception $e) {
echo 'Uh oh! ' . $e->getMessage();
} finally {
echo " - I'm finished now - home time!";
}
Powyższy przykład wyświetli następujące informacje:
O o! Witaj świecie - już skończyłem - czas domowy!
do rzucania
W PHP 7 widzimy wprowadzenie interfejsu Throwable
, który implementuje zarówno Error
jak i Exception
. Dodaje to poziom umowy serwisowej między wyjątkami w PHP 7 i pozwala na implementację interfejsu dla własnych niestandardowych wyjątków:
$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);
Przed PHP 7 możesz po prostu wpisać Exception
ponieważ od PHP 5 wszystkie klasy wyjątków go rozszerzają.
Rejestrowanie błędów krytycznych
W PHP błąd krytyczny jest rodzajem błędu, którego nie można złapać, to znaczy, że po wystąpieniu błędu krytycznego program się nie wznawia. Jednak, aby zarejestrować ten błąd lub jakoś poradzić sobie z awarią, możesz użyć register_shutdown_function
aby zarejestrować moduł obsługi zamykania.
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');
Odniesienie:
- http://php.net/manual/en/function.register-shutdown-function.php
- http://php.net/manual/en/function.error-get-last.php
- http://php.net/manual/en/errorfunc.constants.php