更好的PHP错误处理
admin
2023-06-21 17:22:09
0

=====错误类型====

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_* 是非运行时错误,无法被捕获的


【php.ini】

配置文件是 PHP 初始化的默认配置,通过修改某些参数可以控制对应的初始化参数。如果要控制错误,可以通过以下几个方式来配置:

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


【错误抑制】

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

抑制错误本身内部做了一系列的处理才达到该效果,并且对于错误本身完全是未知的,一般情况下,不建议这么使用


【捕获异常】

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

try {

  // 代码部分

} catch (Exception $e) {

  // 根据异常对象对 $e 进行处理

}


【设置错误处理器】

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

set_error_handler(function($code, $msg){

  log_error("$msg occur with code $code");

});

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


【设置异常处理器】

如果每个异常都去捕获,显然是很复杂的事情,需要编写很多代码,而且维护起来会比较复杂,对于一个快速编程的语言来说,PHP 自然不会允许发生这种事情。使用 set_exception_handler() 就可以像上面错误处理控制器一样接收所有未捕获的异常,然后做一些该做的事情,甚至还可以再把错误抛出来。例如:

set_exception_handler(function($exception){

  log_error("Exception occur: $exception");

});


【崩溃捕获】

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

register_shutdown_function(function(){

  $error = error_get_last();

  if ($error && $error['code']()() & error_reporting()) {

    // 崩溃错误,记录日志

  }

});


相关内容

热门资讯

面对中国,“发达国家犯的最大错... 【文/观察者网 阮佳琪】在2026年北京国际汽车展览会这一全球规模最大的车展举办期间(4月24日至5...
全新问界M9感知系统公布:搭载... PChome 5月27日消息,今日,在全新问界M9发布会中,华为常务董事、产品投资评审委员会主任、终...
看见2030!一起打开河南“十... 5月28日,“开局起步‘十五五’”河南专场新闻发布会在郑州举行。发布会以“奋...
杭州通报非法代孕窝点情况 5月28日,据“天天看临平”公众号,浙江省杭州市临平区今日联合调查处置组发布情况通报。针对群众反映临...
维他科技取得上悬窗用铰链专利,... 国家知识产权局信息显示,广东维他科技有限公司取得一项名为“一种上悬窗用铰链”的专利,授权公告号CN2...
韩国前总统尹锡悦涉嫌作伪证案一... 新华社首尔5月28日电(记者 黄昕欣)据韩联社消息,韩国前总统尹锡悦涉嫌在前国务总理韩德洙涉内乱案...
许君以昌 商通四海——解码城商... 地标“许昌之门”广场上的“许君以昌”石刻,尽显汉魏古都的开放与厚重。在许昌智能继电器股份有限公司装配...
华为成立半导体公司:从自研5G... 快科技5月26日消息,2026国际电路与系统研讨会上,华为公司董事、半导体业务部总裁何庭波在题为半导...
坚决打好“三夏”攻坚战 全力确... 河南日报讯(全媒体记者 李宗宽 王娟)5月27日,副省长李酌赴南阳调研“三夏”生产工作。李酌先后来到...
津巴布韦宣布将14种关键矿产强... 津巴布韦政府近日发布《矿产分类与宣言》,正式将锂、镍、钴、石墨等14种矿产列为受股权和出口管制的“关...