1.错误处理概述
如何能在编程过程中避免错误,是程序员必须要考虑的问题。使代码更加健壮和友好,最好的方法就是一边编写代码一边对错误进行处理。在处理错误之前,首先要认识什么是错误,错误有哪些种类和级别,本节将针对不同的错误类型和错误级别进行详细讲解。
1.常见的错误类型
1.语法错误
语法错误是指编写的代码不符合PHP的编写规范。语法错误最常见,也最容易修复。例如,遗漏了一个分号,就会显示错误信息。这类错误会阻止PHP脚本执行,通常发生在程序开发时,可以通过错误报告进行修复,再重新运行检查。
2.运行错误
运行错误一般不会阻止PHP脚本的执行,但会导致程序出现潜在的问题。例如,在一个脚本中定义了两次同名常量,PHP通常会在第二次定义时提示一条错误信息。虽然PHP脚本继续执行,但第二次定义常量的操作没有执行成功。
3.逻辑错误
逻辑错误是最让人头疼的,不但不会阻止PHP脚本的执行,也不会显示出错误信息。例如,在if语句中判断两个变量的值是否相等,如果错把比较运算符“==”写成赋值运算符“=”就是一种逻辑错误,很难被发现。
4.环境错误
环境错误是由于PHP开发环境配置的问题引起的代码报错,比如用mb_strlen()这个函数时,如果PHP环境中没有启用mbstring扩展,就会导致程序出错。
2.错误级别
PHP中的错误不仅有多种类型,并且每个错误都有一个错误级别与之关联,用于表示当前错误的等级。例如Error、Warning、Notice等错误。PHP采用常量的形式来表示错误级别,每个错误级别都是一个整型。
下表列出了PHP中常见的错误级别。

需要注意的是,表中的E_ALL级别常量在不同的PHP版本中,它的值也不同,在PHP 5.3中是30719,在从PHP 5.4到目前的PHP 7.1版本中是32767。
1.Notice(E_NOTICE)
遇到Notice提示信息通常是代码不严谨造成的,不会影响脚本继续运行。
2.Warning(E_WARNING)
Warning错误级别相比Notice更严重一些,不会影响脚本继续执行。
3.Fatal error(E_ERROR)
Fatal error是一种致命错误,在运行时发生。一旦发生该错误,PHP脚本会立即停止执行。
4.Parse error(E_PARSE)
Parse error是语法解析错误,当脚本存在语法错误时,无法解析成功,就会发生此错误。遇到此错误说明脚本没有执行。如代码中遗漏分号、使用了不合法的变量名,就会发生此错误。
3.手动触发错误
PHP的E_ERROR、E_NOTICE、E_WARNING等错误都是由PHP解释器自动触发的。实际上,除了PHP解释器自动触发的错误外,还可以根据不同的需求自定义错误,它们常用于协助调试,或在发布给其他人的代码中生成不推荐使用的通知等。
在程序开发中,可以使用PHP的内置函数trigger_error()来触发错误,该函数声明如下。
trigger_error( string $error_msg, int $error_type = E_USER_NOTICE) : bool
error_msg
该 error 的特定错误信息,长度限制在了 1024 个字节。超过 1024 字节的字符都会被截断。
error_type
该 error 所特定的错误类型。仅 E_USER 系列常量对其有效,默认是 **E_USER_NOTICE**。
<?phpfunction divide($num1,$num2){if ($num2 == 0){trigger_error('除数不能为0');return false;}return $num1 / $num2;}echo divide(100,0); //输出:Notice: 除数不能为0 in......?>
从上可以看出,手动触发了一个除数不能为0的错误。在程序中使用trigger_error()函数触发的错误也是有级别的,通过该函数的第2个参数来决定其错误级别,可以是E_USER_NOTICE、E_USER_WARNING或者E_USER_ERROR中的一种。如果触发的是E_USER_ERROR错误,在出现错误之后,会停止脚本的执行。
2.如何处理错误
1.显示错误报告
1.修改配置文件
通过直接配置php.ini文件来显示错误报告,代码如下所示。
error_reporting = E_ALL & ~E_NOTICEdisplay_errors = ON
error_reporting用于设置报告的错误级别,display_errors用于设置是否显示错误信息。第1行代码中E_ALL & ~E_NOTICE表示报告除E_NOTICE之外的所有级别的错误,第2行表示将错误报告显示在输出结果中。
2.error_reporting()和ini_set()函数
通过PHP提供的error_reporting()函数和ini_set()函数来实现显示错误报告,代码如下所示。
error_reporting (E_ALL & ~E_NOTICE);ini_set('display_errors',1);
在上述代码中,ini_set()函数用来设置php.ini中指定选项的值,仅在本脚本周期内有效;error_reporting()函数用于设置错误级别。另外,若要获取php.ini中的指定选项值,可以使用ini_get()函数进行获取。
2.记录错误日志
刚才学习了如何让程序显示错误报告,但是如果网站已经上线或者正在运行,错误显示出来会影响用户体验,这时就需要将这些错误记录下来,为后期解决这些错误提供帮助。在PHP语言中可以通过配置文件来记录错误日志信息,也可以通过error_log()函数来记录错误日志信息,接下来将针对这两种方式进行详细讲解。
1.修改配置文件
error_reporting = E_ALLlog_error = ONerror_log = C:\web\php_errors.log
在上述代码中,error_reporting用于设置显示错误级别,E_ALL表示显示所有错误,log_error用于设置是否记录日志,error_log用于指定日志写入的文件路径。
2.error_log()函数
error_log()函数用于将错误记录到指定的日志文件中,示例代码如下。
//将错误信息发送到php.ini中的errr_log配置的日志中error_log('error message a');//将错误信息发送到指定的日志文件中error_log('error message b',3,'C:/web/php.log');
在上述代码中,error_log()函数的第2个参数用于指定将错误信息发送到何处,当省略时默认为php.ini中的error_log配置的日志中,此处设置为3,表示发送到指定的日志文件中。函数的第3个参数的设置取决于第2个参数,此处表示日志文件的路径。error_log()函数的第2个参数还可以设置为其他数字,这里就不再详细讲解,具体可参考PHP手册。
在默认情况下,php.ini中的error_log的值为syslog,表示将错误发送到系统日志。在Windows系统中,可以通过系统提供的事件查看器来查看日志信息。
3.自定义错误处理器
当一个错误发生时,PHP会采取默认方式进行处理。当需要更改错误处理方式时,可以在PHP脚本中设置一个自定义错误处理器,实现在错误发生时自动调用一个函数进行处理。自定义错误处理器是通过set_error_handler()函数来实现的,其函数声明如下。
set_error_handler( callable $error_handler, int $error_types = E_ALL | E_STRICT)
其中,$error_handler回调函数的参数必须符合错误处理器函数的原型,如下所示。
handler( int $errno, string $errstr, string $errfile = ?, int $errline = ?, array $errcontext = ?)
在上述代码中,参数errstr表示错误说明,
errline表示错误发生的代码行的行号,$errcontext表示在触发错误的范围内存在的所有变量的数组。其中,前两个参数是必选参数。
<?php//定义一个处理错误的函数function customError($errno,$errstr){echo "<b>Error:</b> [$errno] $errstr";}//设置自定义错误处理程序set_error_handler('customError');echo $arr; //输出未定义的变量,触发错误,输出结果:Error: [8] Undefined variable: arr?>
注意:
(1)使用set_error_handler()函数设置的错误处理器,无法处理E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING等错误类型。
(2)在使用自定义错误处理器后,系统默认的错误处理就会失效,不显示和记录错误。如果自定义的错误处理函数返回false,则会在自定义处理器函数处理完后交由系统默认的错误处理器来处理。
