【问题标题】:Why doesn't php7 catch Throwable when require fails?为什么要求失败时php7不捕获Throwable?
【发布时间】:2017-09-25 18:53:12
【问题描述】:

我正在尝试捕获一个 require 致命错误 (https://3v4l.org/5MV3I):

try {
    require("foo");
}
catch (Throwable $e) {
    print_r($e);
}

但是脚本在所有 php 版本中都死掉了:

Warning: require(foo): failed to open stream: No such file or directory in /in/5MV3I on line 4

Fatal error: require(): Failed opening required 'foo' (include_path='.:') in /in/5MV3I on line 4

Process exited with code 255.

文档说 (http://php.net/manual/en/function.require.php):

...除非失败,它还会产生致命的 E_COMPILE_ERROR 级别错误。

哪些类型的 php7 致命错误是可捕获的,哪些不是?

【问题讨论】:

  • 致命错误根据定义是不可恢复的。它们被捕获是没有意义的。
  • 如果你想要更优雅的失败,你可以改用include()
  • 阻止代码被解析的那些将无法捕获,因为解析发生在代码运行之前。这就是为什么不需要:这发生在 PHP 仍在组装代码时,并且在它尝试运行任何代码之前。我找不到任何描述两种错误类型(即:编译和运行时)分离的文档。
  • @Sammitch imho 这个一般性陈述对于 php7 来说是完全错误的。至少 php 文档不清楚什么是“致命”错误,并且它不存在于 Error 类层次结构中。另一方面,致命意味着致命 - 只有没有文档哪些是致命的。恕我直言,亚当发现了这个特定错误案例的原因。
  • 可以这样想:您可以从致命错误中恢复您的程序,就像您从致命伤害中恢复身体一样容易。

标签: php php-7


【解决方案1】:

如果你使用“require()”来包含一个文件。你需要它。如果它不存在,则以编译错误结束。 PHP 然后中止。这个想法是,您对关键文件使用 require 。如果这些缺失,它会立即中止。

如果你想捕捉一些东西,你必须使用“include()”。在这里你可以很容易地取得成功:

$includeResult = include("foo");
if (!$includeResult) {
    // you will land here, if include did not work.
}

【讨论】:

  • 请原谅,我把问题说得更清楚了。
  • @andig 好吧,这并没有很好的记录。但几乎每一个致命错误,都是不可捕捉的。也许错误文档对您有更多帮助:php.net/manual/en/errorfunc.constants.php
猜你喜欢
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 2013-10-11
  • 2017-11-04
  • 2012-05-21
  • 2023-03-17
  • 2017-05-25
  • 1970-01-01
相关资源
最近更新 更多