尝试捕获失败的包含
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)。所以你应该使用require
或require_once
。
php.net 引用:
"require() 等同于 include() 除非失败,它也会 产生 致命 E_COMPILE_ERROR 级别 错误。换句话说,它将停止 脚本,而仅包含() 发出警告 (E_WARNING) 允许脚本继续。 "
【讨论】:
除非绝对必要,否则不要使用_once
,因为它会稍微影响性能。
@tntu 你能解释一下吗?我的理解是,在已经包含文件的情况下使用 require 或 include 比使用 _once 更浪费资源。谢谢!
@billrichards 如果您编写了好的代码,则永远不会遇到包含两次相同文件的情况。这里解释了性能差异的解释:***.com/questions/186338/…
@tntu 感谢您提供信息和链接!有一天,当我开始编写好的代码时,我将能够停止使用 require_once 和 include_once以上是关于尝试捕获失败的包含的主要内容,如果未能解决你的问题,请参考以下文章
为啥 XCUITest 在 Xcode 11.4.1 中捕获的流失败