Пользовательские ошибки из файла - PullRequest
0 голосов
/ 02 октября 2009

Я пытаюсь прочитать файл, когда в моих скриптах возникает ошибка, чтобы я мог выбросить пользовательскую страницу ошибки.

При использовании 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 Ответ

2 голосов
/ 02 октября 2009

Вы должны:

  • знать, что file_get_contents возвращает false, когда обнаруживает ошибку.
    • , что означает, что вы можете проверить его возвращаемое значение,
    • и если он вернул false, вы можете отобразить свой шаблон
  • также будьте осторожны: при возникновении проблемы выдается ошибка, и вы не хотите, чтобы она отображалась
    • В такой ситуации вы можете использовать оператор @ ,
    • чтобы "замаскировать" ошибку - вы проверяете, вернул ли она false, в любом случае

Это даст такой код:

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

Который, в моем случае, отображает:

An error has occured

Теперь, до вас, чтобы отобразить ваш шаблон ошибки, в зависимости от платформы, которую вы можете использовать и все такое; -)

...