资讯专栏INFORMATION COLUMN

php自定义Warning的输出信息

yanbingyun1990 / 963人阅读

摘要:我们在此处直接用直接输出要的信息即可,于是有了下面的代码解释直接在组织和输出错误信息即可完成自定义错误信息的输出,这样简单了很多,加上这段代码后以后如果出问题直接去里面查找就可拿到所需的信息,定位到问题所在。

前几天公司平台接入了新的合作商,数据抓取服务一直没问题,到今天有一本书一直报错,查看log发现Warning,出错是由于导致xml解析错误。想到输出一下具体的bookid和chapter_id来查看到底是哪本书哪个章节的问题。

直接想到的方案是try catch在出错的时候输出bookid和chapter_id,但是发现php try catch无法处理Warning错误,于是Google了php如何catch warning,在stackoverflow上找到了如下方法:http://stackoverflow.com/questions/1241728/can-i-try-catch-a-warning

大致的意思是通过 set_error_handler来自定义处理Warning的方法,在其中抛出一个异常然后再try catch它输出bookid和chapter_id,基本照抄给的实例于是如下的代码:

phpset_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) {
  // error was suppressed with the @-operator
     if (0 === error_reporting()) {
         return false;
     }
     throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}, E_WARNING);

try{
  $chapter_content = simplexml_load_string($chaptercontent_xml);
} catch (Exception $e) {
    echo "Caught exception: bookid = $id , chapter_id = $chapter_id ",  $e->getMessage(), "
";
    exit();
}

restore_error_handler();                

解释:使用set_error_handler来接管warning的处理,在其回调函数中抛出一个Exception,然后就可以try catch了,最后调用restore_error_handler();来撤销你设置的error_handler从而使其不影响后续的代码。

思考:这样改完后确实得到了bookid和chapter_id,但是有没有别的更简单方法来实现,其实我最本质的需求就是要自定义输出的Warning消息使其在输出错误的时候带上bookid和chapter_id上面的方法虽然解决了这个问题但是绕了一个大圈。查看php手册上set_error_handler的详细用法发现:

  

errcontext
第五个可选参数, errcontext, 是一个指向错误发生时活动符号表的 array。 也就是说,errcontext 会包含错误触发处作用域内所有变量的数组。 用户的错误处理程序不应该修改错误上下文(context)。

我们在此处直接用errcontext直接输出要的信息即可,于是有了下面的代码:

phpset_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext){
  // error was suppressed with the @-operator
  if (0 === error_reporting()) {
     return false;
  }
  echo "Caught Waring:bookid=$errcontext[bookid],chapter_id=$errcontext[chapter_id] Waring Message:",$errstr," in ",$errfile," on line ",$errline,"
";
}, E_WARNING);

$chapter_content = simplexml_load_string($chaptercontent_xml);

restore_error_handler();

解释:直接在set_error_handler组织和输出错误信息即可完成自定义Warning错误信息的输出,这样简单了很多,加上这段代码后以后如果出问题直接去log里面查找就可拿到所需的信息,定位到问题所在。

总结:在解决完一个问题是最好多想想这个问题的本质,有没有更好的解决方案,这才能不断进步。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31915.html

相关文章

  • 如何处理 PHP 错误与异常(笔记)

    摘要:又或者反过来,把错误当成异常来处理。当然,我猜它的目的,应该也是为了能实现错误与异常之间优雅转换而添加的。至此,错误与异常的学习基本完毕。 这话题已经没有什么新意了,这里只是做做笔记,作为思路的一种整理,也以便后续忘了可以回来这里查找。 错误 以下是 PHP 最常见的几种错误: // E_NOTICE echo $a; // E_WARNING echo 100 / 0; clas...

    kyanag 评论0 收藏0
  • php error_reporting()关闭报错

    摘要:至,有同样的行为。表示关闭所有错误报告表示显示二函数说明设置应该报告何种错误说明函数能够在运行时设置指令。后果是导致脚本终止不再继续运行。初始化启动过程中发生的警告非致命错误。用户产少的警告信息。出外的所有错误和警告信息。 错误报告级别:指定了在什么情况下,脚本代码中的错误(这里的错误是广义的错误,包括E_NOTICE注意、E_WARNING警告、E_ERROR致命错误等)会以错误报告...

    noONE 评论0 收藏0
  • python打印日志方式使用方法(logging模块)

      Python函数库内置系统日志控制模块logging,logging所涉及到的到4个关键部件,这种部件搭建了logging管理体系,接下来本文关键为大家介绍了关于python打印日志方式的使用方法,务必的小伙伴可以借鉴一下  一、基本素养  1、logging模多块应用  (1)5个系统日志等级/还有5个导出系统日志的内置函数  (2)系统日志采集器、日志输出销售渠道定义  (3)怎样自定系统...

    89542767 评论0 收藏0
  • Python内置logging详细使用方法介绍

      小编写这篇文章的主要目的,就是给大家介绍下关于在Python中,有内置的logging,那么,我们在进行使用它的时候,有什么使用方法呢?下面就给大家详细介绍。  logging的主要作用  它的作用是给日志记录的接口和众多处理模块,供用户存储各种格式的日志,帮助调试程序或者记录程序运行过程中的输出信息。  logging日志等级  logging日志等级分为五个等级,优先级从高到低依次是:  ...

    89542767 评论0 收藏0
  • 从0开始构建一个属于你PHP框架

    摘要:如何构建一个自己的框架为什么我们要去构建一个自己的框架可能绝大多数的人都会说市面上已经那么多的框架了,还造什么轮子。 showImg(https://segmentfault.com/img/bVNg9F?w=500&h=500); 如何构建一个自己的PHP框架 为什么我们要去构建一个自己的PHP框架?可能绝大多数的人都会说市面上已经那么多的框架了,还造什么轮子?。我的观点造轮子不是目...

    vpants 评论0 收藏0

发表评论

0条评论

yanbingyun1990

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<