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 session机制
Jul 17 PHP
解析zend studio中直接导入svn中的项目的方法步骤
Jun 21 PHP
解析关于wamp启动是80端口被占用的问题
Jun 21 PHP
PHP判断远程图片或文件是否存在的实现代码
Feb 20 PHP
Laravel框架路由配置总结、设置技巧大全
Sep 03 PHP
PHP连接MySQL数据的操作要点
Mar 20 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
Sep 25 PHP
CodeIgniter针对数据库的连接、配置及使用方法
Mar 03 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
Jul 14 PHP
PHP简单实现数字分页功能示例
Aug 24 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 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
php中用于检测一个地理IP地址是否可用的代码
2012/02/19 PHP
php中hashtable实现示例分享
2014/02/13 PHP
PHP简单遍历对象示例
2016/09/28 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
通过ifame指向的页面高度调整iframe的高度
2006/10/05 Javascript
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
jQuery下通过replace字符串替换实现大小图片切换
2012/05/22 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
2014/02/17 Javascript
JavaScript事件委托技术实例分析
2015/02/06 Javascript
基于javascript数组实现图片轮播
2016/05/02 Javascript
Bootstrap popover用法详解
2016/12/22 Javascript
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
vue获取input输入值的问题解决办法
2017/10/17 Javascript
vue组件name的作用小结
2018/05/23 Javascript
Vue.extend实现挂载到实例上的方法
2019/05/01 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
2020/03/07 Javascript
json_decode 索引为数字时自动排序问题解决方法
2020/03/28 Javascript
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
Caffe均值文件mean.binaryproto转mean.npy的方法
2018/07/09 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
python3 enum模块的应用实例详解
2019/08/12 Python
Python 50行爬虫抓取并处理图灵书目过程详解
2019/09/20 Python
Python基于staticmethod装饰器标示静态方法
2020/10/17 Python
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
护理学毕业生自荐信
2013/10/02 职场文书
财务会计专业毕业生自荐信
2013/10/02 职场文书
趣味比赛活动方案
2014/02/15 职场文书
春节晚会主持词
2014/03/24 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
旷工检讨书大全
2015/08/15 职场文书
2016高中社会实践心得体会范文
2016/01/14 职场文书
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript