2024 年 PHP 日本大会

PHP 7 中的错误

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()处理程序。

添加注释

用户贡献的注释 5 条注释

hungry dot rahly at gmail dot com
8 年前
您可以通过捕获 (Throwable) 来捕获异常和错误。
demis dot palma at tiscali dot it
8 年前
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 中不会到达
}
ryan dot jentzsch@{gmail} dot com
7 年前
一篇关于异常、可抛出对象以及 PHP 7 如何处理这些对象的优秀博文,可以在这里找到:https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
diogoca at gmail dot com
5 年前
<?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 的情况下工作。
lubaev dot ka at gmail dot com
8 年前
php 7.1

try {
// 可能抛出异常或 ArithmeticError 的代码。
} catch (ArithmeticError | Exception $e) {
// 通过
}
To Top