PHP require 语句 - 失败,但抛出 E_WARNING 而不是 E_COMPILE_ERROR

标签 php error-handling require php4

我将我们系统中的一个文件移动到一个子文件夹中进行组织,这又破坏了 require 语句的相对路径。这应该导致 E_COMPILE_ERROR 警告。但是,我们在应用程序中的自定义错误处理程序不是该错误,而是将错误捕获为 E_WARNING。因此,我们的客户处理程序记录了消息,生成的 PHP 屏幕显示为空,就好像 die(); 已运行一样。这是我们的本地处理程序创建的日志:

E_WARNING main(XXXXXX.php): 无法打开流:没有这样的文件或目录 xxx/xxx.php Line 9 01-26-2012 09:44:27 AM 01-26-2012 10:03 :24 点

值得注意的是,我们的系统仍在使用较差的旧 PHP 4

知道为什么 require 会抛出 E_WARNING 吗?由于我们看不到任何错误消息,因此需要更长的时间才能找出问题所在。


编辑:应用程序肯定在做一个要求。自定义错误处理程序只是使用 PHP 的 set_error_handler 函数。因此,除了警告、通知和用户错误之外,不应调用它。


附加编辑:

也许结构与此有关?这是它的工作原理: (-> 表示包含,=> 表示需要)

main->File1.php=>File2.php

是否因为包含但不是必需的 File1.php 而发出警告?这对我来说可能有意义,但似乎是一个小故障?我可能需要在 PHP 5 上对此进行测试。


决议

我扫描了我们的应用程序并发现了这个:

错误报告(E_ERROR | E_WARNING | E_PARSE);

因此,E_COMPILE_ERROR 不会出现。此外,@DaveRandom 是正确的,先抛出警告,然后抛出 fatal error 。

将其更改为 错误报告(E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR); 显示错误信息。

最佳答案

当你在一个不存在的文件上调用它时,Require 至少发出一次这个警告。它然后发出一个E_COMPILE_ERROR 并结束。

However :

The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.

所以我担心您的自定义错误处理程序永远不会捕获错误。

关于PHP require 语句 - 失败,但抛出 E_WARNING 而不是 E_COMPILE_ERROR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9020853/

相关文章:

Php Slim 不使用自定义 errorHandler 处理错误

php - MSSQL PDO 找不到驱动程序

php - PHP : how to use errors within if statements

c++ - 为什么使用无效概念被视为格式错误

Lua 需要 block 环境

javascript - Require 不适用于 node-opcua

php - HTML div 映射

php - mysql - 从 xyz 选择电子邮件,其中电子邮件 ="%gmail.com"

JavaScript 简单的 "error-handling"通过用条件替换 NaN

java - 处理算法中的问题/错误的推荐方法