PHP的错误处理方式

错误类型

PHP 主要有两种错误:触发错误和异常。其中触发错误大概能够分为:编译错误、引擎错误和运行时错误,其中前两个是没法捕获的;异常都是能够捕获的,当没有尝试捕获时则会中断代码。php

触发错误能够经过 error_get_last() 来进行得到,异常可使用标准的 try...catch 语句来捕获。编程

处理方式

错误报告

error_reporting() 函数是 PHP 提供的一个控制错误等级的函数,若是设置了对应的错误等级,则只会在对应错误等级触发时才会在页面(或输出,对于命令行来讲)输出响应的错误信息。网络

error_reporting(int level) 支持等级 level 参数使用二进制的数字来配置错误等级,错误等级通常用常量来代替对应的二进制标识。例如:E_ALL、E_NOTICE、 E_USER_NOTICE 等等;若是不传递参数,则会返回当前的错误等级(通常用来保存当前的错误等级以供后续恢复)。函数

其中 E_PARSE、E_COMPILE_* 和 E_CORE_* 是非运行时错误,没法被捕获的spa

php.ini

配置文件是 PHP 初始化的默认配置,经过修改某些参数能够控制对应的初始化参数。若是要控制错误,能够经过如下几个方式来配置:命令行

display_errors - 是否显示错误,通常在生产环境建议关闭该参数并和下列的参数一块儿试用 log_errors - 记录错误开关,若是打开会记录到对应位置 error_log - 记录错误日志的位置,不指定为系统默认 error_reporting - 同上面的函数rest

错误抑制

PHP 提供了一种特殊的操做,经过在语句前面加上抑制错误操做符@来抑制该语句出现错误。这种状况一般用于你不知道会发生什么状况下使用,好比打开了不肯定的文件或者网络 URL,但通常不推荐使用日志

抑制错误自己内部作了一系列的处理才达到该效果,而且对于错误自己彻底是未知的,通常状况下,不建议这么使用code

捕获异常

几乎在全部语言中,都会有对于异常的处理。若是程序抛出一个异常,那么能够经过 try…catch 语句来捕获该异常,若是明确知道错误的类型,也能够只捕获该类型的错误。try…catch 是一种最标准的错误处理方式对象

1
2
3
4
5
try {  // 代码部分 } catch (Exception $e) {  // 根据异常对象对 $e 进行处理 } 

设置错误处理器

PHP 提供了 set_error_handler() 函数来让开发者传入一个函数名(或匿名函数,对于 5.2 以上的 PHP)就可让全部的错误进入该函数,而后开发者能够在函数内进行控制,举例说明

1
2
3
set_error_handler(function($code, $msg){  log_error("$msg occur with code $code"); }); 

对应地,PHP 也提供了 restore_error_handler() 来恢复为标准的 PHP 错误控制。

设置异常处理器

若是每一个异常都去捕获,显然是很复杂的事情,须要编写不少代码,并且维护起来会比较复杂,对于一个快速编程的语言来讲,PHP 天然不会容许发生这种事情。使用 set_exception_handler() 就能够像上面错误处理控制器同样接收全部未捕获的异常,而后作一些该作的事情,甚至还能够再把错误抛出来。例如:

1
2
3
set_exception_handler(function($exception){  log_error("Exception occur: $exception"); }); 

崩溃捕获

该类处理并不是 PHP 标准的处理方式,但对于某种使程序崩溃的没法捕获的错误确实颇有用,它是指注册一个 shutdown 函数,在函数内经过调用 error_get_last() 来获取最后的错误,而且根据错误等级来作相应的处理。

1
2
3
4
5
6
register_shutdown_function(function(){  $error = error_get_last();  if ($error && $error['code']()() & error_reporting()) {  // 崩溃错误,记录日志  } }); 
相关文章
相关标签/搜索