PHP 错误机制

错误级别

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()
程序继续执行
*/

猜你喜欢

转载自blog.csdn.net/stfphp/article/details/53428109