我正在使用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
),
);
答案 0 :(得分:2)
Twig在出现故障时使用异常,而不是PHP错误。并且您不会在代码中捕获异常。这就是为什么你得到一个空白页面:未被捕获的异常被PHP报告为致命错误,并且在将error_reporting设置为仅E_PARSE时不显示它们。
解决方案是捕获异常,使用set_exception_handler
或try/catch
围绕对Twig的调用。