You can catch both exceptions and errors by catching(Throwable)
PHP 7 zmienia sposób w jaki większość błędów jest zgłszana przez PHP. Zamiast tradycyjnego mechanizmu raportowania używanego przez PHP 5, większość błędów jest teraz zgłaszanych poprzez rzucanie wyjątku Error.
Tak jak normalne wyjątki, te będące typu Error będą oczekiwać na pierwszy pasujący blok catch. Jeżeli nie zostanie znaleziony pasujący blok, wykona się domyślna funkcja obsługująca wyjąki, zarejestrowana przez set_exception_handler(), a jeżeli nie będzie ona ustawiona, to wyjątek będzie przekonwertowany do błędu krytycznego (fatal error) i obsłużony jak tradycyjny błąd.
Ponieważ hierarchia klasy Error nie dziedziczy z
klasy Exception, kod który używa bloków
catch (Exception $e) { ... }
do obsługi niezłapanych
wyjątków w PHP 5, nie złapie wyjątków typu Error.
Wymagany jest blok catch (Error $e) { ... }
lub handler
zarejestrowany przez set_exception_handler().
You can catch both exceptions and errors by catching(Throwable)
Throwable does not work on PHP 5.x.
To catch both exceptions and errors in PHP 5.x and 7, add a catch block for Exception AFTER catching Throwable first.
Once PHP 5.x support is no longer needed, the block catching Exception can be removed.
try
{
// Code that may throw an Exception or Error.
}
catch (Throwable $t)
{
// Executed only in PHP 7, will not match in PHP 5
}
catch (Exception $e)
{
// Executed only in PHP 5, will not be reached in PHP 7
}
An excellent blog post on the difference between exceptions, throwables and how PHP 7 handles these can be found here: https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
php 7.1
try {
// Code that may throw an Exception or ArithmeticError.
} catch (ArithmeticError | Exception $e) {
// pass
}
<?php
set_error_handler(function(int $number, string $message) {
echo "Handler captured error $number: '$message'" . PHP_EOL ;
});
try {
echo $x; # notice, handled on callable
pg_exec(null, null); # warning, handled on callable
fho(); # fatal error, stop running and catched
} catch (Throwable $e) {
echo "Captured Throwable: " . $e->getMessage() . PHP_EOL;
}
?>
set_error_handler will also works without try and catch