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 相关文章推荐
PHP的面试题集
Nov 19 PHP
PHP 循环列出目录内容的函数代码
May 26 PHP
PHP中的函数嵌套层数限制分析
Jun 13 PHP
PHP无限分类(树形类)的深入分析
Jun 02 PHP
CURL状态码列表(详细)
Jun 27 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
Aug 22 PHP
php删除指定目录的方法
Apr 03 PHP
Linux环境下php实现给网站截图的方法
May 03 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
Aug 02 PHP
PHP封装的完整分页类示例
Aug 21 PHP
PHP基于面向对象封装的分页类示例
Mar 15 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
Jul 12 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在数据库抽象层简单使用PDO的方法
2015/11/03 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
2017/02/08 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
PHP基于socket实现客户端和服务端通讯功能
2017/07/13 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
2017/08/17 PHP
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
2013/11/07 Javascript
JS中的log对象获取以及debug的写法介绍
2014/03/03 Javascript
css+js实现部分区域高亮可编辑遮罩层
2014/03/04 Javascript
javascript中的return和闭包函数浅析
2014/06/06 Javascript
javascript的tab切换原理与效果实现方法
2015/01/10 Javascript
jQuery中slideUp 和 slideDown 的点击事件
2015/02/26 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
原生ajax处理json格式数据的实例代码
2016/12/25 Javascript
canvas绘制的直线动画
2017/01/23 Javascript
Angularjs 双向绑定时字符串的转换成数字类型的问题
2017/06/12 Javascript
Vue上传组件vue Simple Uploader的用法示例
2017/08/25 Javascript
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
video.js添加自定义组件的方法
2020/12/09 Javascript
Python对两个有序列表进行合并和排序的例子
2014/06/13 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
python xlsxwriter库生成图表的应用示例
2018/03/16 Python
对python中两种列表元素去重函数性能的比较方法
2018/06/29 Python
django的聚合函数和aggregate、annotate方法使用详解
2019/07/23 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
python 字典访问的三种方法小结
2019/12/05 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
python3 循环读取excel文件并写入json操作
2020/07/14 Python
Tuckernuck官网:经典的美国品质服装、鞋子和配饰
2021/01/11 全球购物
简单介绍Object类的功能、常用方法
2013/10/02 面试题
人事科岗位职责范本
2014/03/02 职场文书
党员公开承诺事项
2014/03/25 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
责任书格式
2019/04/18 职场文书
python实现自定义日志的具体方法
2021/05/28 Python
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸