Обработка ошибок выходного буфера


Давайте предположим, что простой фрагмент кода используется для создания шаблонов и использует управление выводом (ob)

public function capture($file, array $args = array())
{
    extract($args, EXTR_SKIP);

    ob_start();

    require $file; //'foo.php'

    return ob_get_clean();
}

И foo.php с ошибкой (обрабатывается обработчиком ошибок и обработчиком завершения работы)

<?php

echo "before";
echo $someVariable; //$someVariable is undefined here
echo "after";

Вывод

before <- would like to avoid
some message from the error handler

Вопрос: можно ли избежать любого вывода из файла при ошибке?

Да,

  • Есть похожие вопросы, которые я читал/анализировал, но ни один из них не дал мне четкого ответа. ответьте, так это или нет.

    Ошибки внутри выходного буфера

    Как увидеть ошибку php во включенном файле при выводе буфера? (@marc-b - вероятно, это не так)

  • Я понимаю, что вы не должны хотеть обрабатывать такого рода ошибки в своем собственном коде, так как он должен быть чистым и проверенным, но все же вы можете получить некоторые, например, опечатку, неопределенную переменную и т. Д.

Author: Community, 2015-09-21

1 answers

Если вы используете обработчик завершения работы, а не обработчик ошибок, он может очистить вывод, потому что обработчик ошибок может очистить вывод только до него, поэтому все, что выводится после него, все равно будет отображаться.

<?php

function error_handler()
{
    if(error_get_last()) {
        ob_get_clean();
        echo 'An error has occured.';
    }
}

register_shutdown_function('error_handler');

function capture()
{
    ob_start();

    require 'foo.php';

    return ob_get_clean();
}

echo capture();

// foo.php
<?php

echo 'before';
echo $variable;
echo 'after';

?>

Это приведет только к выводу "Произошла ошибка".

Однако, используя set_error_handler, он выведет "Произошла ошибка.после", если вы не добавите DIE() или что-то подобное обработчику ошибок.

 3
Author: Sephedo, 2015-09-20 22:45:21