PHP 程序员也要学会使用“异常”


Posted in PHP onJune 16, 2009

网站完全开放的特性,决定了网站比任何传统软件都更希望做到“系统看起来永远都是能够正常工作的”,所以采用正确的程序错误处理方式尤为重要。理论上来说,如果设计足够完美,开发人员足够谨慎,程序出现错误的可能为0.
但事实恰恰相反,复杂的业务逻辑,不同的硬件环境,或者不可信任的用户输入,都可能导致程序出错,服务当机。所以在稍微有点复杂的系统中,有个完善的错误机制是必须的。
在php5之前,因为缺乏对异常的支持。在做复杂的开发时,常常采取比较原始的“处理错误数值+记录log”的处理形式。
如:

function getResult($a,$b) 
{ 
....... 
if fatal error occur 
return "error_type1"; 
..... 
} 
$result = getResult($a,$b);//理论上,getResult函数总能正确的返回$result 
if($result=='error_type1')//但在一些特殊情况.$result无法正常取得 
{ 
writeLog('result is empty!');//记录下log 
die();//或者其他更“友好的”处理方式 
}

理论上,通过“处理错误数值+记录log”的方式也可以达到我们的目标(事实上确实如此,在php3,php4的时候,已经出现了很多成功且足够复杂的系统,他们甚至考虑到所有的情况,因此不需要记录任何log)。但技术总要向前发展的,更何况,决大多数的开发人员并不具备牛人的严谨到滴水不漏的思维,所以我们还是不得不认真思考“如何处理程序错误”的问题。
上面的“错误处理+记录log”的方式,存在如下弊端:
1 如果错误情况太多,那相应的错误处理代码需要增加很多,这非常损害程序的可读性。你的程序看起来是“断断续续的”。
2 如果程序的逻辑很复杂(比如程序的函数调用非常复杂,如在 getResult2()函数 中调用 getResult() 的情况,甚至更复杂的多级嵌套的情况),那错误数值的传递处理会让你疲于奔命。因为为了确保错误能够得到有效的处理,你必须保证: 以无损耗的方式传递错误数值。
所以,改变这种原始的错误处理方式吧。引入异常处理机制,你会发现可喜的变化:
1 代码可读性大大增强。开发程序时逻辑思维变得很连贯,在“可疑的”地方,你只要抛出个异常就可以了。至于怎么处理,完全可以等到后面再去补充。当然,对于程序的读者,也不会觉得有被打断的感觉。
2 再也不需要考虑“错误数值如何无损耗的进行传递”这种费力又不怎么讨好的问题了。因为异常向上传递的特性,你的函数嵌套个2层,3层,再多层都没有问题。你只需要在外层有捕获异常的操作就可以了。
3 异常可以自由的定制,你可以按照功能对异常进行分类,更好的管理各种程序错误。同时对于你也可以更灵活的定制异常的处理方式。比如,在异常类里面实现记录log的功能等。
当然,是否使用异常要根据需求而定。php的一大特性就是部署快,如果是很小的项目,逻辑很简单,那使用一般的错误数值处理方式也许能够更快的部署。
PHP 相关文章推荐
一个程序下载的管理程序(三)
Oct 09 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
May 10 PHP
PHP入门之常量简介和系统常量
May 12 PHP
PHP调用C#开发的dll类库方法
Jul 28 PHP
PHP如何实现Unicode和Utf-8编码相互转换
Jul 29 PHP
Composer设置忽略版本匹配的方法
Apr 27 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
Jun 13 PHP
thinkphp配置文件路径的实现方法
Aug 30 PHP
Yii2实现增删改查后留在当前页的方法详解
Jan 13 PHP
php实现的二分查找算法示例
Jun 20 PHP
PHP基于IMAP收取邮件的方法示例
Aug 07 PHP
YII2.0框架行为(Behavior)深入详解
Jul 26 PHP
phpmyadmin 访问被拒绝的真实原因
Jun 15 #PHP
两个强悍的php 图像处理类1
Jun 15 #PHP
PHP写MySQL数据 实现代码
Jun 15 #PHP
php ignore_user_abort与register_shutdown_function 使用方法
Jun 14 #PHP
纯真IP数据库的应用 IP地址转化成十进制
Jun 14 #PHP
PHP 定界符 使用技巧
Jun 14 #PHP
php 变量定义方法
Jun 14 #PHP
You might like
php用正则表达式匹配中文实例详解
2013/11/06 PHP
jQuery获取json后使用zy_tmpl生成下拉菜单
2015/03/27 PHP
jQuery实现跟随鼠标运动图层效果的方法
2015/02/02 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
javascript 实现map集合
2015/04/03 Javascript
jquery ajax双击div可直接修改div中的内容
2016/03/04 Javascript
20分钟成功编写bootstrap响应式页面 就这么简单
2016/05/12 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
2016/05/26 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
vue项目tween方法实现返回顶部的示例代码
2018/03/02 Javascript
对Vue- 动态元素属性及v-bind和v-model的区别详解
2018/08/27 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
基于nodejs的雪碧图制作工具的示例代码
2018/11/05 NodeJs
Vue.js的动态组件模板的实现
2018/11/26 Javascript
微信小程序云开发(数据库)详解
2019/05/17 Javascript
JS学习笔记之闭包小案例分析
2019/05/29 Javascript
Vue实现附件上传功能
2020/05/28 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
[00:12]2018DOTA2亚洲邀请赛 Somnus丶M出阵单挑
2018/04/06 DOTA
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
Python修改Excel数据的实例代码
2013/11/01 Python
python实现的简单文本类游戏实例
2015/04/28 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
python利用smtplib实现QQ邮箱发送邮件
2020/05/20 Python
python retrying模块的使用方法详解
2019/09/25 Python
Python numpy多维数组实现原理详解
2020/03/10 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
Matplotlib animation模块实现动态图
2021/02/25 Python
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
2013/01/09 HTML / CSS
Hurley官方网站:扎根于海滩生活方式的全球青年文化品牌
2020/05/18 全球购物
快递业务员岗位职责
2014/01/06 职场文书
幼儿园评语大全
2014/04/17 职场文书
2014年体育教师工作总结
2014/12/03 职场文书
励志语录:时光飞逝,请学会珍惜所有的人和事
2020/01/16 职场文书
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS