PHP批斗大会之缺失的异常详解


Posted in PHP onJuly 09, 2019

故事的开始

这几天观察错误日志发现有一个数据反序列化的notice错误,实际情况我是从缓存中读取数据然后反序列化,因为反序列化失败,所以实际每次都是去数据库取的值。背后性能影响还是挺大的。

缺失的异常

刚开始写代码的时候一直不明白为什么要用异常,感觉if else就能搞定了,为什么还要多此一举,现在反而觉得 php 的异常太少。

对比两种序列化场景,一个是json,另一个是serialize。

json

在json encode/decode的时候,如果出现异常,可以通过json_last_error()来获取。

https://www.php.net/manual/en...

这样的设计只能说勉强够用,不太符合面向对象的套路。

serialize/unserialize

在使用自带的序列化和反序列化的时候,相比json的处理,则更加简单粗暴,没有函数能拿到最后的错误,只会通过自定义的error handler来接管,然后自己去做出一些相应的处理。

为什么要捕获异常

比如我的代码比较乱,有的 key 是 json 序列化,有的 key 是 serialize。我们可以将 key 分类。不能确保其他人配置的对应关系是对的,或者有的人忘记了,所以我需要用捕获异常的方式来兜底,这样我们的代码更加健壮一些。当unserialize失败之后,我们可以尝试去json_decode,而不是立即返回一个false,从而把请求传递到数据库。

代码演示

error_reporting(E_ALL);

$a = ["a" => 1];

class UnSerializeException extends ErrorException
{

}

set_error_handler(function ($severity, $message, $file, $line) {
  $info = explode(":", $message);

  if ($severity == E_NOTICE) {
    if ($info[0] == "unserialize()") {
      throw new UnSerializeException($message);
    }
    return true;
  } else {

    throw new ErrorException($message, 0, $severity, $file, $line);;
  }
});


try {
  $b = unserialize(json_encode($a));
} catch (ErrorException $exception) {
  var_dump(get_class($exception), $exception->getMessage(), $exception->getTraceAsString()); // 捕获到了
} finally {
  restore_error_handler();
}

try {
  $b = unserialize(json_encode($a));
} catch (ErrorException $exception) {
  var_dump(get_class($exception), $exception->getMessage(), $exception->getTraceAsString()); // 无法捕获
}

输出结果

string(20) "UnSerializeException"
string(43) "unserialize(): Error at offset 0 of 7 bytes"
string(181) "#0 [internal function]: {closure}(8, 'unserialize(): ...', '/Users/mengkang...', 34, Array)
#1 /Users/mengkang/PhpstormProjects/xxx/test.php(34): unserialize('{"a":1}')
#2 {main}"

Notice: unserialize(): Error at offset 0 of 7 bytes in /Users/mengkang/PhpstormProjects/xxx/test.php on line 42

后记

所以 php 代码的异常设计还是任重而道远的,而这些已经设定的“旧的规范”要推翻,需要“勇气”,毕竟会影响所有的使用者。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
虚拟主机中对PHP的特殊设置
Oct 09 PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
May 17 PHP
php调用MySQL存储过程的方法集合(推荐)
Jul 03 PHP
php curl模拟post请求小实例
Nov 13 PHP
PHP编程基本语法快速入门手册
Jan 07 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
Mar 15 PHP
PHP实现统计在线人数功能示例
Oct 15 PHP
php插件Xajax使用方法详解
Aug 31 PHP
php微信公众号开发之答题连闯三关
Oct 20 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
Apr 16 PHP
微信支付之JSAPI公众号支付详解
May 15 PHP
eval(cmd)与eval($cmd)的区别与联系
Jul 07 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
Jul 09 #PHP
PHP+Redis开发的书签案例实战详解
Jul 09 #PHP
使用composer命令加载vendor中的第三方类库 的方法
Jul 09 #PHP
Laravel+Intervention实现上传图片功能示例
Jul 09 #PHP
Laravel框架实现多个视图共享相同数据的方法详解
Jul 09 #PHP
Laravel5.1框架注册中间件的三种场景详解
Jul 09 #PHP
PHP使用 Pear 进行安装和卸载包的方法详解
Jul 08 #PHP
You might like
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
2011/08/12 PHP
几个有用的php字符串过滤,转换函数代码
2012/05/01 PHP
Codeigniter的一些优秀特性总结
2015/01/21 PHP
PHP汉字转换拼音的函数代码
2015/12/30 PHP
基于PHP后台的Android新闻浏览客户端
2016/05/23 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
JS 树形递归实例代码
2010/05/18 Javascript
可以用来调试JavaScript错误的解决方案
2010/08/07 Javascript
javascript动态加载三
2012/08/22 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
JavaScript判断变量是对象还是数组的方法
2014/08/28 Javascript
JavaScript中的null和undefined区别介绍
2015/01/01 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
详解JS面向对象编程
2016/01/24 Javascript
jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
2016/07/07 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
AngularJS使用ng-options指令实现下拉框
2016/08/23 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
jQuery实现的简单歌词滚动功能示例
2019/01/07 jQuery
Nodejs实现图片上传、压缩预览、定时删除功能
2019/10/25 NodeJs
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
JavaScript仿京东秒杀倒计时
2020/03/17 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
屏蔽Django admin界面添加按钮的操作
2020/03/11 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
2020/06/10 Python
建筑工程专业学生的自我评价
2013/12/25 职场文书
创业计划实施的7大步骤
2014/02/05 职场文书
小学优秀教师材料
2014/12/15 职场文书
2015年酒店工作总结范文
2015/04/07 职场文书
初中重阳节活动总结
2015/05/05 职场文书
应收账款管理制度
2015/08/06 职场文书
大学生入党自我鉴定范文
2019/06/21 职场文书