【问题标题】:exception_handling -> not as robust as simply logging error?exception_handling -> 不如简单地记录错误那么健壮?
【发布时间】:2011-04-24 08:32:46
【问题描述】:

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

所以,在阅读了这里的手册和其他帖子后,我必须明白,必须实现set_exception_handler,并且还要有 set_error_handler 回调以不抛出 E_NOTICE、E_WARNING。

到目前为止这是正确的吗?重新阅读手册页后,似乎 set_exception_handler 会在每个错误时停止脚本,即使是可恢复的错误,无法让脚本继续。

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

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

【问题讨论】:

    标签: exception-handling php


    【解决方案1】:

    这是 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,则向该地址发送有关错误的电子邮件)。

    【讨论】:

    • 好吧,看起来不错,但它不使用异常处理,我想我可以在最后一个 if 子句中抛出一个。所以如果所有异常都被捕获,就不需要使用set_exception_handler?或者它是否与 set_exception_handler 一起使用,以处理和正确处理 uncaught 异常?
    • 这“捕获”了其他任何东西都没有捕获的异常。然后它让用户看起来很漂亮(不泄露有关错误的信息),并将有关错误的所有信息通过电子邮件发送给管理员。是的,它适用于 set_error_handler() (如 set_exception_handler())
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 2011-10-02
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      相关资源
      最近更新 更多