你可以通过捕获(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 的捕获块。
一旦不再需要 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) {
// pass
}