Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Exception handling 异常处理->;不如简单地记录错误那么健壮?_Exception Handling_Php - Fatal编程技术网

Exception handling 异常处理->;不如简单地记录错误那么健壮?

Exception handling 异常处理->;不如简单地记录错误那么健壮?,exception-handling,php,Exception Handling,Php,php中的异常处理。。。我注意到了一些怪癖,这些怪癖似乎使正确实施变得乏味。首先,大多数遗留php函数本身不会抛出异常,似乎必须实现并拥有回调抛出函数。好啊小烦恼,但让我们看看是什么给。哦很好,现在一切都抛出一个异常,当然,最糟糕的部分是:未捕获的异常会停止脚本 所以,在阅读了手册和其他文章之后,我们会想到,我们必须实现,并且设置错误处理程序回调,不抛出E_通知,E_警告 到目前为止这是正确的吗?在重新读取手册页之后,似乎set_exception_处理程序会在每次出现错误时停止脚本,即使是可恢

php中的异常处理。。。我注意到了一些怪癖,这些怪癖似乎使正确实施变得乏味。首先,大多数遗留php函数本身不会抛出异常,似乎必须实现并拥有回调抛出函数。好啊小烦恼,但让我们看看是什么给。哦很好,现在一切都抛出一个异常,当然,最糟糕的部分是:未捕获的异常会停止脚本

所以,在阅读了手册和其他文章之后,我们会想到,我们必须实现,并且设置错误处理程序回调,不抛出E_通知,E_警告

到目前为止这是正确的吗?在重新读取手册页之后,似乎set_exception_处理程序会在每次出现错误时停止脚本,即使是可恢复的错误,脚本也无法继续

所以这对我来说似乎是一个禁忌,我不能让脚本停止执行以获得通知或事件警告


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

这是拉里·厄尔曼(Larry Ullman)在其著作《PHP 5高级》(一本好书)中编写的异常处理程序。
它与你所说的大部分内容相抗衡

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');
function my_error_handler($e_number、$e_message、$e_file、$e_line、$e_vars)
{
全局$debug,$contact\u电子邮件;
$message=“脚本“$e_文件”的第$e_行出现错误:\n
$e_message\n
”; $message.=“日期/时间:”.Date('n-j-Y H:i:s')。“\n
”; $message.=''.print\r($e\u vars,1)。“\n
”; 如果($debug) { 回显“

”.$message.

”; } 其他的 { 错误日志($message,1,$contact\u email); 如果($e_编号!=e_通知)&($e_编号<2048)) { echo“

发生系统错误。对于由此带来的不便,我们深表歉意。

”; } } } 设置错误处理程序(“我的错误处理程序”);
注意:我刚打出来,可能是打字错误


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

这是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');
function my_error_handler($e_number、$e_message、$e_file、$e_line、$e_vars)
{
全局$debug,$contact\u电子邮件;
$message=“脚本“$e_文件”的第$e_行出现错误:\n
$e_message\n
”; $message.=“日期/时间:”.Date('n-j-Y H:i:s')。“\n
”; $message.=''.print\r($e\u vars,1)。“\n
”; 如果($debug) { 回显“

”.$message.

”; } 其他的 { 错误日志($message,1,$contact\u email); 如果($e_编号!=e_通知)&($e_编号<2048)) { echo“

发生系统错误。对于由此带来的不便,我们深表歉意。

”; } } } 设置错误处理程序(“我的错误处理程序”);
注意:我刚打出来,可能是打字错误


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

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


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

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


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

好的,看起来不错,但它没有使用异常处理,我想我可以在最后一个if子句中抛出一个。所以,如果捕获了所有异常,就不需要使用set_exception_处理程序了?或者它与set_exception_handler一起使用,以处理和正确处理未捕获的异常?它“捕获”其他任何东西都无法捕获的异常。然后,它会让用户觉得它很漂亮(不会泄露错误信息),并向管理员发送有关错误的所有电子邮件。是的,它与set\u error\u handler()一起工作(像set\u exception\u handler()),好吧,看起来不错,但它不使用异常处理,我想我可以在最后一个if子句中抛出一个。所以,如果捕获了所有异常,就不需要使用set_exception_处理程序了?或者它与set_exception_handler一起使用,以处理和正确处理未捕获的异常?它“捕获”其他任何东西都无法捕获的异常。然后,它会让用户觉得它很漂亮(不会泄露错误信息),并向管理员发送有关错误的所有电子邮件。是的,它与set\u error\u handler()一起工作(比如set\u exception\u handler())