You can catch both exceptions and errors by catching(Throwable)
PHP 7 verändert, wie die meisten Fehler durch PHP berichtet werden. Anstatt Fehler durch den traditionellen Berichterstattungsmechanismus, der durch Php 5 verwendet wurde, zu berichten, werden die meisten Fehler nun durch das Werfen einer Error-Ausnahme berichtet.
Wie auch normale Ausnahmen, werden diese Error-Ausnahmen
so lange nach oben weiter gereicht bis sie einen ersten passenden
catch
-Block
erreichen. Wenn es keinen passenden Block gibt, wird der standardmäßige
Exception-Handler, der durch set_exception_handler()
eingerichtet werden kann, aufgerufen und wenn es keinen standardmäßigen
Exception-Handler gibt wird die Ausnahme in einen fatalen Fehler umgewandelt
und diese wie ein traditioneller Fehler behandelt.
Da die Error-Hierarchie nicht von
Exception abgeleitet ist, wird Code der
catch (Exception $e) { ... }
-Blöcke zur Behandlung von
ungefangenen Ausnahmen in PHP 5 verwendet feststellen, dass
Error nicht durch diese Blöcke gefangen werden.
Dazu wird entweder ein catch (Error $e) { ... }
-Block
oder ein durch set_exception_handler() gesetzter
Handler benötigt.
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