您可以通过捕获 (Throwable) 来捕获异常和错误。
PHP 7 改变了 PHP 报告大多数错误的方式。它不再像 PHP 5 那样通过传统的错误报告机制报告错误,而是通过抛出Error异常来报告大多数错误。
与普通异常一样,这些Error异常会一直冒泡,直到到达第一个匹配的catch
块。如果没有匹配的块,则将调用使用set_exception_handler()安装的任何默认异常处理程序;如果没有默认异常处理程序,则该异常将转换为致命错误,并像传统错误一样处理。
由于Error层级不继承自Exception,因此在 PHP 5 中使用catch (Exception $e) { ... }
块处理未捕获异常的代码会发现这些Error不会被这些块捕获。需要catch (Error $e) { ... }
块或set_exception_handler()处理程序。
Throwable 在 PHP 5.x 上不起作用。
要在 PHP 5.x 和 7 中捕获异常和错误,请在首先捕获 Throwable 后添加一个用于 Exception 的 catch 块。
一旦不再需要 PHP 5.x 支持,就可以删除捕获 Exception 的块。
try
{
// 可能抛出异常或错误的代码。
}
catch (Throwable $t)
{
// 仅在 PHP 7 中执行,在 PHP 5 中不匹配
}
catch (Exception $e)
{
// 仅在 PHP 5 中执行,在 PHP 7 中不会到达
}
一篇关于异常、可抛出对象以及 PHP 7 如何处理这些对象的优秀博文,可以在这里找到:https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
<?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 也可以在没有 try 和 catch 的情况下工作。
php 7.1
try {
// 可能抛出异常或 ArithmeticError 的代码。
} catch (ArithmeticError | Exception $e) {
// 通过
}