为什么PHP 7不会捕获某些错误?

时间:2018-07-17 13:55:31

标签: php

PHP 7 中,可以抛出的任何对象的基本接口是Throwable。对于所有内部PHP错误,我们还有一个Error基类。但是为什么我不能捕捉到以下错误:

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';
}

预期结果:“捕获DivisionByZeroError”
实际结果:PHP警告:..除以零。

c)

try {
    trigger_error('User error');
} catch(\Error $e) {
    echo 'Catch error';
} catch (\Throwable $e) {
    echo 'Catch throwable';
}

预期结果:“捕获错误”
实际结果:PHP注意:..

中的用户错误

我的PHP版本7.1.1(cli)

2 个答案:

答案 0 :(得分:4)

您列出的错误不会被捕获,因为它们不会被抛出。它们不是例外,而是传统错误,自PHP代码开始以来,triggered就是该语言的开始,也就是在该语言中引入例外和OOP之前的几年。

但是,您可以使用install an error handler来创建和抛出ErrorException对象,以处理错误。
ErrorException类的文档包括一个简单的示例。

答案 1 :(得分:1)

并非所有的PHP函数都会引发异常。异常是一个面向对象的概念,而这些都是普通的旧PHP函数。

请务必查看手册,以了解返回结果!

http://php.net/manual/en/function.fopen.php

http://php.net/manual/en/function.trigger-error.php