Twig White页面而不是致命错误

时间:2015-09-19 14:29:55

标签: php twig fatal-error

我正在使用Twig,它提供了白页而不是致命错误。我知道这取决于错误报告设置,但我必须明确将其设置为E_ALL才能使其正常工作。

我有一个error_handler()函数,我设置它来处理致命和标准(即未定义的变量/索引)错误。这很有效。

我必须将error_reporting值设置为E_PARSE,以便错误处理程序不会显示错误,并将其输出到浏览器。但是当谈到使用Twig时,除非我明确地将错误报告设置为E_ALL,否则它只返回一个空白页面,这不是好事。

我希望我的错误处理程序能够处理这些错误。例如,如果在Twig之外发生异常,则错误处理程序可以正常工作。否则,它就没有了。

我的问题是,是否有某种方法迫使Twig使用我想要的错误处理程序(例如传递值),同时保持当前设置?

以下是一个示例文件:

<?php

require PANTHER_ROOT.'include/lib/Twig/Autoloader.php';

// Register Twig autoloader
Twig_Autoloader::register();

// Make sure PHP reports no errors apart from parse errors (this is handled by the error handler)
error_reporting(E_PARSE);

// Sort out error handling stuff ...
register_shutdown_function('error_handler');
set_error_handler('error_handler');

function error_handler($errno = 0, $errstr = 'Error', $errfile = 'unknown', $errline = 0)
{
    // do something
}

function load_template($tpl_file)
{
    global $tpl_manager, $style_root;
    if (file_exists($style_root.$tpl_file))
        $tpl_file = $tpl_manager->loadTemplate('@style/'.$tpl_file);
    else
        $tpl_file = $tpl_manager->loadTemplate('@core/'.$tpl_file);

    return $tpl_file;
}

$loader = new Twig_Loader_Filesystem('include/templates');

$style_rot = 'something';
$loader->addPath('include/templates/', 'core');
$loader->addPath($style_root, 'style');

$tpl_manager = new Twig_Environment($loader);


// then, in a seperate file:

$tpl_file = load_template('header.tpl');
$tpl_file->render(
    array(
        // stuff
    ),
);

1 个答案:

答案 0 :(得分:2)

Twig在出现故障时使用异常,而不是PHP错误。并且您不会在代码中捕获异常。这就是为什么你得到一个空白页面:未被捕获的异常被PHP报告为致命错误,并且在将error_reporting设置为仅E_PARSE时不显示它们。

解决方案是捕获异常,使用set_exception_handlertry/catch围绕对Twig的调用。