尝试捕获失败的包含

Posted

技术标签:

【中文标题】尝试捕获失败的包含【英文标题】:try catch a failed include 【发布时间】:2011-07-28 03:49:21 【问题描述】:

这是一个简单的问题,谷歌搜索一小时似乎无法解决。如何在 php 中捕获失败的包含?对于以下代码:

try 
    include_once 'mythical_file';
 catch (Exception $e) 
    exit('Fatal');


echo '?';

由于mythical_file 不存在,我得到输出'?'。我知道 PHP 无法捕获所需的失败,因为它会触发警告错误,但是在这里呢?捕获失败的包含的最佳方法是什么?例如,以下工作:

(include_once 'unicorn') or exit('!');

但它不会触发异常,因此我无法检索文件、行和堆栈上下文。

【问题讨论】:

您可能希望结合使用register_shutdown_function() 查看error_get_last()。应该能够检索文件、行等。 【参考方案1】:

您可以使用require_once 代替include_once

【讨论】:

好吧,我想我将不得不关闭票证,因为它显然可以在我的一些虚拟主机上运行,​​而另一些则不能(使用 require 将触发 500 错误)。无论如何感谢您的帮助! @fabjoa, @Gaurav - 我们这里没有“门票”,所以没有什么可以关闭的。【参考方案2】:

include 和include_once 触发警告(E_WARNING),require 和require_once 触发错误(E_COMPILE_ERROR)。所以你应该使用requirerequire_once

php.net 引用:

"require() 等同于 include() 除非失败,它也会 产生 致命 E_COMPILE_ERROR 级别 错误。换句话说,它将停止 脚本,而仅包含() 发出警告 (E_WARNING) 允许脚本继续。 "

【讨论】:

除非绝对必要,否则不要使用_once,因为它会稍微影响性能。 @tntu 你能解释一下吗?我的理解是,在已经包含文件的情况下使用 require 或 include 比使用 _once 更浪费资源。谢谢! @billrichards 如果您编写了好的代码,则永远不会遇到包含两次相同文件的情况。这里解释了性能差异的解释:***.com/questions/186338/… @tntu 感谢您提供信息和链接!有一天,当我开始编写好的代码时,我将能够停止使用 require_once 和 include_once

以上是关于尝试捕获失败的包含的主要内容,如果未能解决你的问题,请参考以下文章

PHP:尝试/捕获失败

尝试使用 JQuery 捕获日志失败和 404

KDB:尝试捕获列表并返回失败列表

为啥 XCUITest 在 Xcode 11.4.1 中捕获的流失败

405 - 未捕获(承诺中)错误:请求失败,状态码为 405

C#、While 循环、尝试捕获、记录、继续