exception_handling - >不像简单记录错误那样健壮吗?

时间:2011-04-24 08:32:47

标签: exception-handling php

php中的异常处理...我注意到一些怪癖似乎使得实现正确的繁琐。首先,大多数遗留的php函数本身不会抛出异常,似乎必须实现set_error_handler并具有回调throw函数。好。轻微的烦恼,但让我们看看是什么给。哦!好的,现在一切都抛出异常,当然,最糟糕的部分:未捕获的异常会停止脚本。

所以,在阅读手册和其他帖子后,必须要考虑一下,必须实现set_exception_handler,并且还要使用set_error_handler回调不要抛出E_NOTICE,E_WARNING。

到目前为止这是正确的吗?在重新阅读联机帮助页后,似乎set_exception_handler会在每个错误上暂停脚本,甚至是无法的可恢复脚本,以便脚本继续运行。

所以这对我来说似乎不行,我不能让脚本停止执行通知或事件警告。

有解决方法吗?我很想知道别人如何处理异常和这些问题。

2 个答案:

答案 0 :(得分:3)

Larry Ullman在他的“PHP 5 Advanced(一本好书)”一书中写道,这是一个例外处理程序 它打击了你所说的大部分内容

function my_error_handler ($e_number, $e_message, $e_file, $e_line, $e_vars)
{
    global $debug, $contact_email;
    $message = "An error occurred in script '$e_file' on line $e_line: \n<BR />$e_message\n<br />";
    $message .= "Date/Time: " . date('n-j-Y H:i:s') . "\n<br />";
    $message .= "<pre>" . print_r ($e_vars, 1) . "</pre>\n<BR />";
    if ($debug)
    {
        echo '<p class="error">'.$message.'</p>';
    }
    else
    {
        error_log($message, 1,$contact_email);
        if (($e_number != E_NOTICE) && ($e_number < 2048))
        {
            echo '<p class="error">A system error occurred.  We apologize for the inconvenience.</p>';
        }
    }
}
set_error_handler('my_error_handler');

注意:我刚输入此内容,可能是拼写错误。

您需要定义变量$ debug(如果为true,将错误消息打印到网页),并联系电子邮件(如果$ debug为false,则向该地址发送有关错误的电子邮件)。

答案 1 :(得分:2)

您必须编写错误处理程序以检查生成的错误级别,并根据该错误决定是否抛出异常。

set_error_handler的第二个参数允许您指定将触发处理程序的错误级别。处理程序的第一个参数是错误级别编号,因此您可以在处理程序中检查它。