0

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

使用 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
4

1 回答 1

2

你必须 :

  • 知道file_get_contents遇到错误时返回 false。
    • 这意味着你可以测试它的返回值,
    • 如果它返回false,您可以显示您的模板
  • 还要小心:当出现问题时,它会产生错误,并且您不希望显示该错误
    • 在这种情况下,您可以使用@ 运算符
    • “掩盖”错误——你测试它是否返回错误,无论如何

它会给出这样的代码:

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

在我的情况下,显示:

An error has occured

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

于 2009-10-01T22:56:59.747 回答