This question already has answers here:
Can I try/catch a warning?

(11个答案)


2年前关闭。




PHP 7 中,可以抛出的任何对象的基本接口(interface)是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';
}

预期结果:“Catch 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)

最佳答案

您列出的错误不会被捕获,因为它们不会被抛出。它们不是异常(exception),而是传统错误,自PHP代码开始以来就已成为triggered,这是在语言中引入异常(exception)和OOP之前的几年。

但是,您可以创建install an error handler来处理错误,方法是为它们创建并抛出 ErrorException 对象。
ErrorException 类的文档包括一个简单的示例。

关于php - 为什么PHP 7不会捕获某些错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51383257/

10-10 00:11
查看更多