1 基础
PHP生成的每个错误都包含一个类型。这些错误的类型列表如下,表中有关于它们行为的简短描述以及产生的原因。
| 常量
| 说明
| 备注
|
1
| E_ERROR(integer)
| 致命的运行时错误。这类错误一般是不可恢复的情况,例如内存分配导致的问题。后果是导致脚本终止不再继续运行。
|
|
2
| E_WARNING(integer)
| 运行时警告 (非致命错误)。仅给出提示信息,但是脚本不会终止运行。
|
|
4
| E_PARSE(integer)
| 编译时语法解析错误。解析错误仅仅由分析器产生。
|
|
8
| E_NOTICE(integer)
| 运行时通知。表示脚本遇到可能会表现为错误的情况,但是在可以正常运行的脚本里面也可能会有类似的通知。
|
|
16
| E_CORE_ERROR(integer)
| 在PHP初始化启动过程中发生的致命错误。该错误类似E_ERROR,但是是由PHP引擎核心产生的。
| since PHP 4
|
32
| E_CORE_WARNING(integer)
| PHP初始化启动过程中发生的警告 (非致命错误) 。类似 E_WARNING,但是是由PHP引擎核心产生的。
| since PHP 4
|
64
| E_COMPILE_ERROR(integer)
| 致命编译时错误。类似E_ERROR,但是是由Zend脚本引擎产生的。
| since PHP 4
|
128
| E_COMPILE_WARNING(integer)
| 编译时警告 (非致命错误)。类似E_WARNING,但是是由Zend脚本引擎产生的。
| since PHP 4
|
256
| E_USER_ERROR(integer)
| 用户产生的错误信息。类似E_ERROR, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。
| since PHP 4
|
512
| E_USER_WARNING(integer)
| 用户产生的警告信息。类似E_WARNING, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。
| since PHP 4
|
1024
| E_USER_NOTICE(integer)
| 用户产生的通知信息。类似E_NOTICE, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。
| since PHP 4
|
2048
| E_STRICT(integer)
| 启用 PHP 对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。
| since PHP 5
|
4096
| E_RECOVERABLE_ERROR(integer)
| 可被捕捉的致命错误。 它表示发生了一个可能非常危险的错误,但是还没有导致PHP引擎处于不稳定的状态。 如果该错误没有被用户自定义句柄捕获 (参见set_error_handler()),将成为一个 E_ERROR 从而脚本会终止运行。
| since PHP 5.2.0
|
8192
| E_DEPRECATED(integer)
| 运行时通知。启用后将会对在未来版本中可能无法正常工作的代码给出警告。
| since PHP 5.3.0
|
16384
| E_USER_DEPRECATED(integer)
| 用户产少的警告信息。 类似E_DEPRECATED, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。
| since PHP 5.3.0
|
30719
| E_ALL(integer)
| E_STRICT除外的所有错误和警告信息。
| 30719 in PHP 5.3.x,6143 in PHP 5.2.x,2047 previously
|
2 .PHP错误处理
如果在代码中没有对错误进行处理的时候,PHP将会根据错误的类型进行处理. 通过php.ini的error_reporting或者error_reporting()可以用来隐藏或控制错误信息. 但是,强烈建议设置配置指令,因为在脚本开始执行之前可能会发生一些错误,这样便于定位错误位置。
在开发环境中,您应该始终将error_reporting设置为E_ALL,因为您需要了解并修复PHP提出的问题。在生产中,您可能希望将其设置为更详细的级别,比如E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED,但是在许多情况下,E_ALL也是可以的,因为它可能提供及早的帮你暴露问题。
PHP如何处理错误取决于另外两个php.ini参数。
display_errors控制是否将错误显示为脚本输出的一部分。在生产环境中,应该始终禁用这一功能,因为它可以包含诸如数据库密码之类的机密信息,但在开发过程中常常是有用的,因为它可以确保立即报告问题。
除了display_errors之外, 在配置文件中log_errors指令开启时候记录错误。这会将任何错误记录到error_log定义的文件或syslog中。这在生产环境中非常有用,因为您可以记录发生的错误,然后基于这些错误生成报告。
3. 用户自定义错误处理
如果PHP的默认错误处理不能满足要求,您也可以通过使用set_error_handler()来处理多种类型的错误。当有些错误类型不能使用这种方式处理时候,你也可以在脚本中使用其他合适的方式处理:例如,向用户展示一个自定义的错误页面,然后通过比日志更直接方式,比如通过发送一个包含错误信息的电子邮件到指定邮箱。
4.PHP7 的错误信息处理
PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为Error异常抛出。
这种 Error异常可以像 Exception异常一样被第一个匹配的 try/ catch块所捕获。如果没有匹配的catch块,则调用异常处理函数(事先通过 set_exception_handler()注册)进行处理。如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。
Error类并非继承自 Exception类,所以不能用 catch (Exception $e) { ... } 来捕获Error。你可以用catch (Error $e) { ... },或者通过注册异常处理函数(set_exception_handler())来捕获 Error。
<?php
try {
func();
} catch (Error $e) {
echo $e->getMessage(), PHP_EOL;
}
Error 层次结构:
- Throwable
- Error
- ArithmeticError(算术错误)
- DivisionByZeroError(除0错误)
- AssertionError(声明错误)
- ParseError(解析错误)
- TypeError(类型错误)
- Exception
- ...