PHP错误及处理

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异常一样被第一个匹配的 trycatch块所捕获。如果没有匹配的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
    - ...

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值