用户友好的错误输出

时间:2013-05-23 22:32:42

标签: php error-handling

我在PHP中的错误处理需要一些帮助。我开发了一个使用MVC模式进行时间跟踪的软件。这意味着在控制器中完成所有工作之后,我会包含一些模板文件。这些PHP模板包含在require_once $templatePath.$hash['template']['file']中,包含HTML和PHP的简单混合。

现在我的问题是,在错误(不是异常)上,我的HTML输出已被解析,直到错误发生。现在,用户只能看到网站的一些片段。我使用set_error_handler( array($this, 'handleErrors') );设置了自己的错误处理,将错误写入我的数据库然后停止PHP执行。

现在我想为用户提供干净的输出,但到目前为止如何删除当前输出?如果出现错误,我想为用户显示特殊的消息输出。如果这不起作用,我希望将用户重定向到静态HTML站点(模板)。

任何想法如何实现这一点?

编辑:我使用我的函数处理的错误是例如使用不存在的数组键的警告或关于弃用函数的通知等。

[8] Undefined index: email at ../users.tpl in line 51

通常这种错误不应该发生......但是如果我想为用户提供一个好的输出。

3 个答案:

答案 0 :(得分:0)

在错误发生之前,我遇到了同样的内容呈现问题,我尝试使用输出缓冲,似乎没有工作,所以我所做的是将用户重定向到一个很好的错误页面,表示 UNEXPECTED 发生了错误。在您的情况下,您显然会首先注册错误,然后重新定向,如果您选择使用我的方法。

最好的问候。

答案 1 :(得分:0)

据推测,您的所有输出在某个时刻都以字符串形式结束。因此,当我们谈论缓冲所有内容时,我们正在谈论保留您的输出以在最后将其刷新给用户。我确信有一千零一种不同的方法可以做到这一点......但是让我们考虑一个非常基本的想法,并考虑MVC格式。

假设我有我的基本页面index.php,通过它可以发送所有内容(通过mod_rewrite或类似内容)。 Index.php是开始和结束;它启动对控制器的调用,并显示视图的结果。

如果我的index.php通过调用控制器启动,那么该控制器可能是“用户”控制器,位于http://www.example.com/users。当然,这是http://www.example.com/index.php?p=users,并且可能带有一些后期数据来查询数据库。

所以index.php可能看起来像:

<?
$buffer = file_get_contents( 'templates/header' );
$error = "";
// Load the "users" controller
$controller = $registry->loadController($_GET['p']);

// Returns false on error
$temp = $controller->getBiographyByName( $_POST['name'] )
if ($temp) {
  $buffer .= $temp 
} else {
  $error = "An error occurred while attempting to load Biography for ".$_POST['name'];
}
// do everything else...

if( $error !== "" ) print( $error );
else print( $buffer );

我正在努力保持这个尽可能简单,并假设有一些后台逻辑($ registry)处理查找和加载适当的控制器。这些控制器将决定使用哪些模型,以及将哪些模板加载到视图中。这个想法是缓冲一切,只有在内容可以显示的情况下才输出。

同样,这是非常简化的,但我希望它有所帮助。

答案 2 :(得分:-1)

使用输出缓冲:http://php.net/manual/en/function.ob-start.php。 从您希望输出的第一个位置(任何HTML,消息等)启动它到用户。刷新(发送给用户)或清除(丢弃)输出缓冲区,具体取决于是否一切都成功或者是否有错误并且调用了错误函数。

例如:

function handleErrors(){
    //whatever you're doing to log

    ob_end_clean();

    //Whatever you do to output your standard error page and stop execution.
}