文件中的自定义错误

时间:2009-10-01 22:03:02

标签: php file-get-contents

我正在尝试在脚本中发生错误时读取文件,因此我可以抛出自定义错误页面。

使用ob_start / set_error_handler时,我无法在回调中使用file_get_contents或ob_start来获取错误模板的内容。

有人知道如何在回调中输出我的自定义模板(以及使用eval)吗?


编辑:一些代码

error_reporting(E_ALL);
ini_set("display_errors", 1); 

function fatal_error_handler($buffer) {
  if (ereg("(error</b>:)(.+)(<br)", $buffer, $regs) ) {
    $ErrorString = preg_replace("/<.*?>/","",$regs[2]);
    error_log($ErrorString);

    $template = file_get_contents(sprintf('%s/errors/Error.php', TEMPLATES));
    return eval(sprintf('?>%s<?', $template);
    //return "ERROR CAUGHT check log file";
  }
  return $buffer;
}

function handle_error ($errno, $errstr, $errfile, $errline)
{
    error_log("$errstr in $errfile on line $errline");
    if($errno == FATAL || $errno == ERROR){
        ob_end_flush();
        echo "ERROR CAUGHT check log file";
        exit(0);
    }
}

ob_start("fatal_error_handler");
set_error_handler("handle_error");

上面只显示一个空白页面。

error_reporting(E_ALL);
ini_set("display_errors", 1); 

function fatal_error_handler($buffer) {
  if (ereg("(error</b>:)(.+)(<br)", $buffer, $regs) ) {
    $ErrorString = preg_replace("/<.*?>/","",$regs[2]);
    error_log($ErrorString);

    ob_start();
    include(sprintf('%s/errors/Error.php', TEMPLATES));
    $template = ob_get_contents();
    ob_end_clean();
    return eval(sprintf('?>%s<?', $template));
    //return "ERROR CAUGHT check log file";
  }
  return $buffer;
}

function handle_error ($errno, $errstr, $errfile, $errline)
{
    error_log("$errstr in $errfile on line $errline");
    if($errno == FATAL || $errno == ERROR){
        ob_end_flush();
        echo "ERROR CAUGHT check log file";
        exit(0);
    }
}

ob_start("fatal_error_handler");
set_error_handler("handle_error");

以上给出了以下内容:

Fatal error: ob_start() [<a href='ref.outcontrol'>ref.outcontrol</a>]: Cannot use output buffering in output buffering display handlers in /var/www/index.php on line 16

1 个答案:

答案 0 :(得分:2)

你必须:

  • 知道file_get_contents在遇到错误时返回false。
    • 表示您可以测试其返回值
    • 如果它返回false,则可以显示模板
  • 也要小心:当出现问题时,会产生错误,并且您不希望显示错误
    • 这种情况可以使用@ operator
    • 来“掩盖”错误 - 你测试它是否返回false,无论如何

它会提供这种代码:

$result = @file_get_contents('non-existing-file');
if ($result === false) {
    echo "An error has occured";
}

在我的情况下,显示:

An error has occured

现在,由您决定显示您的错误模板,具体取决于您可能正在使用的框架以及所有这些; - )