PHP中的异常处理(广义)和其他语言有些不同,在PHP中,最初时没有异常处理机制的,只有自身的错误处理机制,用来处理脚本编译运行过程中出现的语法错误和运行环境问题,根据错误的严重程度分为不同的级别;后来在引入异常处理机制的过程中为了和已有的错误处理机制不冲突,就将PHP中的异常处理设定为只能捕获用户自定义的异常,而对于编译过程中的语法问题,PHP默认由自身的错误处理机制处理,用户无法进行捕获,这样两种机制各司其职,分别应对不同的情况。相比于其它语言中将所有运行中的错误都当做异常来处理,PHP的异常处理机制学习起来较为繁琐。
错误处理
错误级别
值 | 常量名 | 描述 | 举例 |
---|---|---|---|
1 | E_ERROR | 这类错误一般不可恢复,例如内存分配导致的问题。导致脚本终止不再继续运行。 | Error:Invalid parameters. Invalid parameter name |
2 | E_WARNING | 运行时警告 (非致命错误)。脚本不会终止运行。 | Warning: require_once |
4 | E_PARSE | 编译时语法解析错误。如字符、变量或结束的地方写规范有误。 | Parse error: syntax error, unexpected $end in |
8 | E_NOTICE | 运行时通知。如变量未定义等。 | Notice: Undefined variable: p in E:index.php on line 17 |
16 | E_CORE_ERROR | 在PHP初始化启动过程中发生的致命错误。 | |
32 | E_CORE_WARNING | PHP初始化启动过程中发生的警告 (非致命错误) 。 | |
64 | E_COMPILE_ERROR | 致命编译时错误。 | |
128 | E_COMPILE_WARNING | 编译时警告 (非致命错误)。 | |
256 | E_USER_ERROR | 用户产生的错误信息。由用户使用PHP函数 trigger_error() 产生。 | |
512 | E_USER_WARNING | 用户产生的警告信息。由用户使用PHP函数 trigger_error() 产生。 | |
1024 | E_USER_NOTICE | 用户产生的通知信息。由用户使用PHP函数 trigger_error() 产生。 |
三种错误处理方式
- die函数
die()语句,可以输出提示信息后退出,不再执行之后的代码
1 | if (!file_exists("filename")) { |
- 自定义错误处理
1.自定义错误处理器,用于处理系统错误
1 | #创建自定义错误函数(处理器) |
2.自定义错误触发器,用于处理逻辑错误
1 | #trigger_error("业务逻辑不合理");//Notice: 业务逻辑不合理 in F:\work\php_workspace\错误异常处理1.php on line 59 |
总结,自定义错误处理时需要厘清以下要点: 1. 自定义的错误属于系统错误还是业务逻辑错误,前者采用错误处理器,使用不带_USER的错误级别;后者采用错误触发器,使用带_USER的错误级别 2. 需要输出哪些错误信息和说明 3. 错误的严重程度如何,发生错误提示后是否还要继续执行之后的代码,即是否用exit函数中断程序
- 错误日志
PHP支持向服务器的错误记录系统或文件发送错误日志,包括本地保存和远程发送,默认错误日志输出信息的在php.in中的error_log配置,也可以通过在自定义错误函数中设置error_log()函数实现
1 | function my_error3($error_level,$error_mess) |
异常处理
try-catch-finally
该语句用于在指定错误发生时改变脚本的正常流程,可以有效的控制错误
1 | function f1($a) |
顶级异常处理器
对于当前代码段抛出后未捕获的异常会继续向上抛出,直到被PHP默认的顶级异常处理器捕获,用户也可以自己定义自己的顶级异常处理器
1 | #自定义一个顶级异常处理器 |