set_error_handler不工作我希望它如何工作

sta*_*zel 12 php

我正在迈出一步:我的PHP脚本将全部失败!

至少,这就是我所希望的......"

我不想在try...catch语句中包含(实际上)每一行,所以我认为最好的办法是为我的文件开头创建一个自定义错误处理程序.

我正在练习页面上测试它:

function customError($level,$message,$file,$line,$context) {
    echo "Sorry, an error has occured on line $line.<br />";
    echo "The function that caused the error says $message.<br />";
    die();
}

set_error_handler("customError");

echo($imAFakeVariable);
Run Code Online (Sandbox Code Playgroud)

这很好,返回:

抱歉,第17行发生错误.导致错误的函数显示未定义变量:imAFakeVariable.

但是,此设置不适用于未定义的功能.

function customError($level,$message,$file,$line,$context) {
    echo "Sorry, an error has occured on line $line.<br />";
    echo "The function that caused the error says $message.<br />";
    die();
}

set_error_handler("customError");

imAFakeFunction();
Run Code Online (Sandbox Code Playgroud)

返回:

致命错误:调用未定义的函数:第17行/Library/WebServer/Documents/experimental/errorhandle.php中的imafakefunction()

为什么我的自定义错误处理程序不捕获未定义的函数?这会导致其他问题吗?

Ros*_*oss 11

set_error_handler旨在通过以下代码处理错误:E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE.这是因为set_error_handler它是一种报告用户错误函数引发的错误的方法trigger_error.

但是,我确实在手册中找到了可能对您有所帮助的评论:

"下面的错误类型不能与用户定义的函数来处理:E_ERROR,E_PARSE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,和大部分E_STRICT,其中在该文件中提出的set_error_handler()被称为".

这不完全正确. set_error_handler()无法处理它们,但ob_start()至少可以处理E_ERROR.

<?php

function error_handler($output)
{
    $error = error_get_last();
    $output = "";
    foreach ($error as $info => $string)
        $output .= "{$info}: {$string}\n";
    return $output;
}

ob_start('error_handler');

will_this_undefined_function_raise_an_error();

?>
Run Code Online (Sandbox Code Playgroud)

实际上,虽然这些错误应该在文件中静默报告,例如.希望你的项目不会有很多E_PARSE错误!:-)

至于一般的错误报告,坚持使用Exceptions(我发现将它们与我的MVC系统联系起来很有帮助).您可以构建一个非常通用的Exception来通过按钮提供选项并添加大量描述以让用户知道什么是错误的.


小智 7

我猜你需要使用register_shutdown_function

例如:

 register_shutdown_function( array( $this, 'customError' ));.

   function customError() 
   {

     $arrStrErrorInfo = error_get_last();

     print_r( $arrStrErrorInfo );

   }
Run Code Online (Sandbox Code Playgroud)