错误级别
PHP中总共设置了 16种错误级别,常见的有下面几种:
E_ALL
包含所有的错误级别
E_ERROR
这种级别的错误会显示 Fatal Error,是最严重的错误级别。产生这种错误后,程序将不会继续执行。比如调用了不存在的函数,就会产生这种错误。
Fatal error: Uncaught Error: Call to undefined function sad() in C:\Myenv\apache\htdocs\basic\test.php on line 19
sad();
E_WARNING
警告级别的错误严重程度稍轻,不会终止脚本,程序将会继续进行。显示的错误信息是Warning。比如 include的文件不存在,将会产生这种错误。
( ! ) Warning: include(aa.php): failed to open stream: No such file or directory in C:\Myenv\apache\htdocs\basic\test.php on line 19
include('aa.php');
E_NOTICE
这种错误程度更为轻微一些,提示你代码中书写不当的地方。这个错误的代码可能在其他地方没有问题,只是在当前上下文情况下出现了问题。比如说使用了一个之前未定义过的变量时,会产生这种错误。
Notice: Undefined variable: var in C:\Myenv\apache\htdocs\basic\test.php on line 19
echo $var;
E_DEPRECATED
产生错误说明在你使用了一个旧版本的函数,而这个函数后期版本可能被禁用或者不维护了。程序还是可以正常运行的。比如说在 PHP7中使用了 mysql_扩展函数,就会产生这种错误。
E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE, E_USER_DEPRECATED,
这几个错误级别是用户触发的错误。这就使得我们可以手动触发 Fatal error、Warning、Notice、Deprecated 错误了。
Fatal error: This is a fatal error in C:\Myenv\apache\htdocs\basic\test.php on line 19
trigger_error('This is a fatal error!', E_USER_ERROR);
E_PARSE
上述的几个错误都是 run-time型错误,也就是运行时产生的错误。而 E_PARSE级别的错误是在 PHP引擎对 PHP代码进行语法检查时发生的错误。发生这种错误时,代码就不会被执行。少写分号就会产生这种错误。
Parse error: syntax error, unexpected 'echo' (T_ECHO), expecting ',' or ';' in C:\Myenv\apache\htdocs\basic\test.php on line 20
echo 1
echo 2;
相关配置
error_reporting = E_ALL // 报告什么级别的错误。相当于告诉 PHP我们关心什么类型的错误,其他类型的错误统统忽略,什么都不做
log_errors = On // 是否将错误记录到错误日志
log_errors_max_len = 1024 // 错误日志的最大长度
error_log = /tmp/php_errors.log // 错误日志保存的路径
display_errors = On // 是否把错误展示在输出上,这个输出可能是页面,也可能是stdout
display_startup_errors = On // 显示是否把 PHP启动过程的错误信息。
ignore_repeated_errors = Off // 是否忽略重复的错误
track_errors = Off // 是否使用全局变量 $php_errormsg来记录最后一个错误
xmlrpc_errors = 0 //是否使用XML-RPC的错误信息格式记录错误
xmlrpc_error_number = 0 // 用作 XML-RPC faultCode 元素的值。
html_errors = On // 是否把输出中的函数等信息变为HTML链接
docref_root = http://manual/en/ // 如果html_errors开启了,这个链接的根路径是什么
fastcgi.logging = 0 // 是否把php错误抛出到fastcgi中
以处理异常的方式处理错误
在PHP7中,大多数错误可以像 Exception 异常一样被第一个匹配的 try / catch 块所捕获。如果没有匹配的 catch 块,则调用异常处理函数(事先通过 set_exception_handler() 注册)进行处理。 如果尚未注册异常处理函数,则按照传统方式处理,即报告为一个致命错误(Fatal Error)。
层次结构:
◦ Throwable
◦ Error
◦ ArithmeticError
◦ DivisionByZeroError
◦ AssertionError
◦ ParseError
◦ TypeError
◦ Exception
◦ …
可以看到 Error 类并非继承自 Exception 类,所以不能用 catch (Exception $e) { … } 来捕获 Error。你可以用 catch (Error $e) { … },或者通过注册异常处理函数( set_exception_handler())来捕获 Error。
这种方式处理错误的好处是,比如遇到了 Fatal Error,程序就不会终止了,而且可以非常自由地定义错误显示与处理方式。
<?php
try{
sad();
} catch (Throwable $e) {
echo $e->getMessage();
}
echo '程序继续执行';
?>
结果:
/*
Call to undefined function sad()
程序继续执行
*/