如何在PHP中捕获require()或include()的错误?

时间:2011-11-24 19:34:39

标签: php error-handling try-catch require fatal-error

我在PHP5中编写了一个需要某些文件代码的脚本。当A文件不可用时,首先会发出警告,然后抛出致命错误。当无法包含代码时,我想打印自己的错误消息。如果requeire不起作用,是否可以执行最后一个命令?以下不起作用:

require('fileERROR.php5') or die("Unable to load configuration file.");

使用error_reporting(0)来抑制所有错误消息只会显示白屏,而不是使用error_reporting会产生PHP错误,我不想显示它。

6 个答案:

答案 0 :(得分:15)

您可以将set_error_handlerErrorException结合使用来完成此操作。

ErrorException页面中的示例是:

<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");

/* Trigger exception */
strpos();
?>

如果您将错误作为例外处理,您可以执行以下操作:

<?php
try {
    include 'fileERROR.php5';
} catch (ErrorException $ex) {
    echo "Unable to load configuration file.";
    // you can exit or die here if you prefer - also you can log your error,
    // or any other steps you wish to take
}
?>

答案 1 :(得分:15)

我只使用'file_exists()':

if (file_exists("must_have.php")) {
    require "must_have.php";
}
else {
    echo "Please try back in five minutes...\n";
}

答案 2 :(得分:5)

更好的方法是首先在路径上使用realpath。如果文件不存在,realpath将返回false

$filename = realpath(getcwd() . "/fileERROR.php5");
$filename && return require($filename);
trigger_error("Could not find file {$filename}", E_USER_ERROR);

您甚至可以在应用程序namespace中创建自己的require函数来包装PHP的require函数

namespace app;

function require_safe($filename) {
  $path = realpath(getcwd() . $filename);
  $path && return require($path);
  trigger_error("Could not find file {$path}", E_USER_ERROR);
}

现在您可以在文件中的任何位置使用它

namespace app;

require_safe("fileERROR.php5");

答案 3 :(得分:1)

我建议您查看recent comment函数文档中set_error_handler()的最多{。}}。

它建议以下作为捕获致命错误的方法(并举例说明):

<?php
function shutdown()
{
    $a=error_get_last();
    if($a==null)  
        echo "No errors";
    else
         print_r($a);

}
register_shutdown_function('shutdown');
ini_set('max_execution_time',1 );
sleep(3);
?> 

我没有尝试过这个建议,但是这可能适用于其他致命的错误情况。

答案 4 :(得分:1)

您需要使用include()。 Require(),当在不存在的文件上使用时,会产生致命错误并退出脚本,因此你的die()不会发生。 Include()仅抛出警告,然后脚本继续。

答案 5 :(得分:0)

我使用的一种简单方法是

<?php
    ...
    if(!include 'config.php'){
        die("File not found handler. >_<");
    }
   ...
?>