【发布时间】:2018-12-25 06:23:39
【问题描述】:
在 PHP 7 中,任何可以抛出的对象的基本接口都是Throwable。我们还有一个 Error 基类,用于所有内部 PHP 错误。但是为什么我不能捕捉到这样的错误:
a)
try {
$file = fopen('not_exist_file', 'r');
} catch (\Error $e) {
echo 'Cannot open a file';
}
预期结果:'无法打开文件'
实际结果:PHP 警告:fopen(not_exist_file):打开流失败:没有这样的文件或目录
b)
try {
$result = 10 / 0;
} catch(\DivisionByZeroError $e){
echo 'Catch DivisionByZeroError';
} catch (\Throwable $e) {
echo 'Catch Throwable';
}
预期结果:'Catch DivisionByZeroError'
实际结果:PHP 警告:在..中除以零
c)
try {
trigger_error('User error');
} catch(\Error $e) {
echo 'Catch error';
} catch (\Throwable $e) {
echo 'Catch throwable';
}
预期结果:'Catch error'
实际结果:PHP 注意:用户错误..
我的 PHP 版本 7.1.1 (cli)
【问题讨论】:
-
“但是为什么我不能捕获像 [...] 这样的错误” - 因为它们是简单的错误。你只能catch 某人首先threw,而fopen 或除以0 根本不会做类似的事情。
-
您列出的错误没有被捕获,因为它们没有被抛出。它们不是异常,而是 PHP 代码从一开始就出现 triggered 的传统错误,早在异常和 OOP 被引入语言之前几年。
-
要“捕捉”这些语言级别的错误,您需要设置自定义错误处理程序 - php.net/manual/en/function.set-error-handler.php
-
警告而不是错误的一个原因See this for explanation
标签: php