【问题标题】:Why PHP 7 doesn't catch some errors? [duplicate]为什么 PHP 7 没有捕捉到一些错误? [复制]
【发布时间】: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


【解决方案1】:

您列出的错误没有被捕获,因为它们没有被抛出。它们不是异常,而是 PHP 代码从一开始就出现 triggered 的传统错误,早在异常和 OOP 被引入语言之前几年。

但是,install an error handler 可以通过为错误创建和抛出 ErrorException 对象来处理错误。
ErrorException 类的文档包含一个简单的示例说明如何操作。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 1970-01-01
      • 2019-05-16
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 2017-07-25
      • 1970-01-01
      相关资源
      最近更新 更多