【发布时间】: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 类层次结构中。另一方面,致命意味着致命 - 只有没有文档哪些是致命的。恕我直言,亚当发现了这个特定错误案例的原因。
-
可以这样想:您可以从致命错误中恢复您的程序,就像您从致命伤害中恢复身体一样容易。