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 相关文章推荐
在Windows版的PHP中使用ADO
Oct 09 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
Jun 03 PHP
php处理restful请求的路由类分享
Feb 27 PHP
微信营销平台系统?刮刮乐的开发
Jun 10 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 PHP
CodeIgniter多语言实现方法详解
Jan 20 PHP
解读PHP的Yii框架中请求与响应的处理流程
Mar 17 PHP
CI操作cookie的方法分析(基于helper类库)
Mar 28 PHP
示例详解Laravel重置密码代码重构
Aug 10 PHP
PHP有序表查找之插值查找算法示例
Feb 10 PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
Oct 25 PHP
PHP设计模式之观察者模式定义与用法分析
Apr 04 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&mysql(六)
2006/10/09 PHP
PHP 如何获取二维数组中某个key的集合
2014/06/03 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
php通过session防url攻击方法
2014/12/10 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
2015/03/05 PHP
php中文乱码问题的终极解决方案汇总
2017/08/01 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
JavaScript 异步调用框架 (Part 6 - 实例 & 模式)
2009/08/04 Javascript
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
JavaScript在IE和Firefox(火狐)的不兼容问题解决方法小结
2010/04/13 Javascript
JavaScript去掉空格的方法集合
2010/12/28 Javascript
用JavaScript实现对话框的教程
2015/06/04 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
详解Vue2.0之去掉组件click事件的native修饰
2017/04/20 Javascript
ES6入门教程之let和const命令详解
2017/05/17 Javascript
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
python实现的一个火车票转让信息采集器
2014/07/09 Python
Python实现的一个简单LRU cache
2014/09/26 Python
Python正则获取、过滤或者替换HTML标签的方法
2016/01/28 Python
python实现可以断点续传和并发的ftp程序
2016/09/13 Python
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
python 编码规范整理
2018/05/05 Python
Python socket连接中的粘包、精确传输问题实例分析
2020/03/24 Python
Python如何把Spark数据写入ElasticSearch
2020/04/18 Python
通过实例简单了解python yield使用方法
2020/08/06 Python
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
四种会话跟踪技术
2015/05/20 面试题
监理员的岗位职责
2013/11/13 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
小学生组织委员竞选稿
2015/11/21 职场文书
2016年优秀团员事迹材料
2016/02/25 职场文书
python之np.argmax()及对axis=0或者1的理解
2021/06/02 Python
win10重装系统后上不了网怎么办 win10重装系统网络故障的解决办法
2022/07/23 数码科技