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); }