如果未捕获错误/警告/通知,如何自动停止任何脚本并重定向到错误页面

时间:2013-06-13 08:22:25

标签: php debugging error-handling

编辑:关于上面的链接答案,它类似但不同,因为我的目标是在错误页面中调试错误。


有时意外错误很难调试,因为错误报告打印在奇怪的HTML元素中,如隐藏的div或选项元素。

如果触发了任何未捕获的错误,是否有办法在全局变量中自动存储错误对象并将脚本重定向到错误页面?有没有办法为所有错误执行此操作,包括通常不会退出脚本的错误,如警告和通知?

3 个答案:

答案 0 :(得分:3)

您使用custom error handler执行此操作。将错误转换为异常是一种好方法,并允许您对错误处理进行非常精细的控制:

set_error_handler(function ($errno, $errstr, $errfile, $errline) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
});

您可以决定抛出异常和忽略哪些错误;例如,您可能想要忽略或只记录E_NOTICE。使用全局try..catch块或custom exception handler,您现在可以非常轻松地决定在出现错误时该怎么做。

答案 1 :(得分:1)

确实有一些方法可以将错误重定向到页面,记录它们,跟踪它们,以及什么不是。 PHP非常灵活。好消息是你不需要homecook这样的方法,框架是可用的,但你也可以没有这些生存,因为内置的PHP错误处理设施是足够可用的。如果配置正确,PHP将中止错误(或警告,您决定),记录它们,如果插入Web服务器,甚至返回HTTP 500服务器错误代码。

您可能需要正确配置PHP。它完全能够实现更好的错误处理工作流程。首先,禁用错误打印,这不是表现良好的应用程序应该如何报告错误,最糟糕的是,使用打印的错误输出帮助恶意用户进入系统。你不是唯一一个查看你的网页的人,你知道并不是所有的用户都会看到这些,有些人会等待这些。这是您可以使用的指令之一,编辑配置PHP的“php.ini”文件;它禁止混合错误输出与其他任何PHP输出作为内容生成的一部分:

display_errors = "0"

您也可以将其设置为“stderr”,这在使用命令行PHP调用调试脚本时是一件好事,因为输出将被发送到另一个文件通道,即所谓的标准错误。

请注意以下“php.ini”指令:

log_errors = "1"

以上内容将PHP日志错误发送到文件或使用Web服务器错误日志记录工具,具体取决于调用PHP的方式。在UNiX系统上,列出错误及其详细信息的日志文件将驻留在“/ var / log / www /”中。

仔细阅读有关错误处理和报告的PHP文档,或许可以从以下页面开始:

http://www.php.net/manual/en/book.errorfunc.php

不要忘记阅读安装配置。我再说一遍,从来没有公开PHP脚本的PHP显示错误!(是的,我知道你正在调试,但我现在不能强调这一点)。

答案 2 :(得分:0)

感谢@MladenB。和deceze,我解决了我的问题。这就是我编写解决方案的方式:

在config.php文件中,包含在脚本中(最好将函数移动到个人库文件中):

<?php

function my_error_handler($errno, $errstr, $errfile, $errline)
{
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}

function my_exception_handler($e)
{
    /**
     *  Exception handler that pass the error object to an error page.
     *  This is to avoid bad displaying or hiding of error reports.
     *  
     *  @param $e Exception  The exception to manage
     */

    if (session_status() !== PHP_SESSION_ACTIVE)
    {
        session_start();
    }

    session_register_shutdown();

    $_SESSION['error'] = $e;

    header('Location: error.php');
    exit();
}

set_error_handler('my_error_handler');
set_exception_handler('my_exception_handler');

in error.php:

<?php

session_start();
session_register_shutdown();

$e = $_SESSION['error'];

echo '<h2>Stack trace</h2>';
echo var_dump($e->getTrace());

throw $e;