PHP错误处理机制

1、错误分类

1.1、编译错误(parse error)

大都是书写错误,如语法错误(syntax)

1.2、运行错误

会根据错误等级决定程序是否继续运行

1.3、逻辑错误

程序执行结果不符合期望

2、错误报告级别

每一个错误级别对应一个数字代码

   [E_ERROR] => 1
    [E_RECOVERABLE_ERROR] => 4096
    [E_WARNING] => 2
    [E_PARSE] => 4
    [E_NOTICE] => 8
    [E_STRICT] => 2048
    [E_DEPRECATED] => 8192
    [E_CORE_ERROR] => 16
    [E_CORE_WARNING] => 32
    [E_COMPILE_ERROR] => 64
    [E_COMPILE_WARNING] => 128
    [E_USER_ERROR] => 256
    [E_USER_WARNING] => 512
    [E_USER_NOTICE] => 1024
    [E_USER_DEPRECATED] => 16384
    [E_ALL] => 32767

2.1、系统错误(E_...)

E_PARSE //语法错误
E_ERROR //严重错误,导致脚本中止
E_WARNING //警告错误,但脚本不中止
E_NOTICE //提示错误,但脚本不中止
E_ALL包含所有的错误、警告和注意信息
修改php配置文件设置是否显示报错:display_errors = On/Off

2.2、自定义错误(E_USER_...)

使用trigger_error函数可以触发用户自定义错误:trigger_error('参数不能为空',E_USER_WARNING),这种错误也会记录在服务器软件(如apache)的错误日记中

2.3、内核错误(E_CORE_...)

3、调整错误报告显示级别

修改配置文件:error_reporting = E_ALL (E_ALL & ~E_NOTICE)
使用error_reporting()函数:这种方式设置后,可以立即生效。但仅限于在当前脚本中的error_reporting()函数调用的后面区域。
int error_reporting ([ int $level ] )
参数可以是整型或对应的常量标识符,推荐使用常量的形式。返回值为当前位置处起作用的错误报告级别的值(整型值)。
error_reporting(E_ALL ^ E_NOTICE); // 除了E_NOTICE之外,报告所有的错误
error_reporting(E_ERROR); // 只报告致命错误
echo error_reporting(E_ERROR | E_WARNING | E_NOTICE); // 只报告E_ERROR、E_WARNING 和 E_NOTICE三种错误

4、错误处理方法

4.1、使用 die() 函数
采用了一个简单的错误处理机制在错误之后终止了脚本。
4.2、自定义错误和错误触发器
可以简单地创建了一个专用函数,可以在 PHP 中发生错误时调用该函数。
该函数必须有能力处理至少两个参数 (error level 和 error message),但是可以接受最多五个参数(可选的:file, line-number 以及 error context):
语法:error_function(error_level,error_message, error_file,error_line,error_context)
参数描述
error_level :必需。为用户定义的错误规定错误报告级别。必须是一个值数。参见下面的表格:错误报告级别。
error_message :必需。为用户定义的错误规定错误消息。
error_file :可选。规定错误在其中发生的文件名。
error_line :可选。规定错误发生的行号。
error_context :可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。
错误报告级别
2 E_WARNING 非致命的 run-time 错误。不暂停脚本执行。
8 E_NOTICE Run-time 通知。脚本发现可能有错误发生,但也可能在脚本正常运行时发生。
256 E_USER_ERROR 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。
512 E_USER_WARNING 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。
1024 E_USER_NOTICE 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。
4096 E_RECOVERABLE_ERROR 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())
8191 E_ALL 所有错误和警告,除级别 E_STRICT 以外。(在 PHP 6.0,E_STRICT 是 E_ALL 的一部分)
一个处理错误的函数

function customError($errno, $errstr){ 
    echo "<b>Error:</b> [$errno] $errstr<br />";
    echo "Ending Script";
    die();
}


当以上函数被触发时,它会取得错误级别和错误消息。然后它会输出错误级别和消息,并终止脚本。
set_error_handler("customError");
由于我们希望我们的自定义函数来处理所有错误,set_error_handler() 仅需要一个参数,可以添加第二个参数来规定错误级别。

//error handler function
function customError($errno, $errstr){ 
    echo "<b>Error:</b> [$errno] $errstr";
}
//set error handler
set_error_handler("customError");
//trigger error
echo($test);

以上代码的输出应该类似Error: [8] Undefined variable: test

触发错误trigger_error()

$test=2;
if ($test>1){
    trigger_error("Value must be 1 or below");
}

以上代码的输出应该类似这样:Notice: Value must be 1 or below in C:webfolder est.php on line 6

可以在脚本中任何位置触发错误,通过添加的第二个参数,能够规定所触发的错误级别。
可能的错误类型:
E_USER_ERROR - 致命的用户生成的 run-time 错误。错误无法恢复。脚本执行被中断。
E_USER_WARNING - 非致命的用户生成的 run-time 警告。脚本执行不被中断。
E_USER_NOTICE - 默认。用户生成的 run-time 通知。脚本发现了可能的错误,也有可能在脚本运行正常时发生。
综合例子
如果 "test" 变量大于 "1",则发生 E_USER_WARNING 错误。如果发生了 E_USER_WARNING,将使用自定义错误处理程序并结束脚本:

//error handler function
function customError($errno, $errstr){ 
    echo "<b>Error:</b> [$errno] $errstr<br />";
    echo "Ending Script";
    die();
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1){
    trigger_error("Value must be 1 or below",E_USER_WARNING);
}

以上代码的输出应该类似这样:Error: [512] Value must be 1 or below Ending Script

5、错误报告

默认根据在 php.ini 中的 error_log 配置,PHP 向服务器的错误记录系统或文件发送错误记录。通过使用 error_log() 函数,您可以向指定的文件或远程目的地发送错误记录。
通过电子邮件向自己发送错误消息,是一种获得指定错误的通知的好办法
在下面的例子中,如果特定的错误发生,我们将发送带有错误消息的电子邮件,并结束脚本:

//error handler function
function customError($errno, $errstr){ 
    echo "<b>Error:</b> [$errno] $errstr<br />";
    echo "Webmaster has been notified";
    error_log("Error: [$errno] $errstr",1,
    "someone@example.com","From: webmaster@example.com");
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1){
    trigger_error("Value must be 1 or below",E_USER_WARNING);
}
原文地址:https://www.cnblogs.com/chuanzi/p/10364794.html