【问题标题】: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('!');

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

【问题讨论】:

标签: php include try-catch


【解决方案1】:

您可以使用require_once 代替include_once

【讨论】:

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

includeinclude_once 触发警告(E_WARNING)requirerequire_once 触发错误(E_COMPILE_ERROR)。所以你应该使用requirerequire_once

php.net 引用:

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

【讨论】:

  • 除非绝对必要,否则不要使用_once,因为它会稍微影响性能。
  • @tntu 你能解释一下吗?我的理解是,在已经包含文件的情况下使用 require 或 include 比使用 _once 更浪费资源。谢谢!
  • @billrichards 如果您编写了好的代码,则永远不会遇到包含两次相同文件的情况。这里解释了性能差异的解释:stackoverflow.com/questions/186338/…
  • @tntu 感谢您提供信息和链接!有一天,当我开始编写好的代码时,我将能够停止使用 require_once 和 include_once
猜你喜欢
  • 2014-01-24
  • 2011-12-22
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 2015-10-14
  • 2014-12-01
相关资源
最近更新 更多