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使之能同时支持GIF和JPEG
Oct 09 PHP
在JavaScript中调用php程序
Mar 09 PHP
php+jquery编码方面的一些心得(utf-8 gb2312)
Oct 12 PHP
php入门学习知识点二 PHP简单的分页过程与原理
Jul 14 PHP
php数据类型判断函数有哪些
Sep 23 PHP
php实现parent调用父类的构造方法与被覆写的方法
Feb 11 PHP
php模拟post提交数据的方法
Feb 12 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
Sep 23 PHP
Thinkphp实现自动验证和自动完成
Dec 19 PHP
php微信公众号开发之快递查询
Oct 20 PHP
mysqli扩展无法在PHP7下升级问题的解决
Sep 10 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 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自动加载的两种实现方法
2010/06/21 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
2016/05/13 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
2018/06/04 PHP
PHP判断一个变量是否为整数、正整数的方法示例
2019/09/11 PHP
最新28个很棒的jQuery 教程
2011/05/28 Javascript
jQuery图片的展开和收缩实现代码
2013/04/16 Javascript
原生JS实现表单checkbook获取已选择的值
2013/07/21 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
2015/06/10 Javascript
简介JavaScript中Math.LOG10E属性的使用
2015/06/14 Javascript
在Ubuntu系统上安装Node.JS的教程
2015/10/15 Javascript
最简单的JavaScript图片轮播代码(两种方法)
2015/12/18 Javascript
JS模拟简易滚动条效果代码(附demo源码)
2016/04/05 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
2016/07/06 Javascript
最原始的jQuery注册验证方式
2016/10/11 Javascript
详解Vue整合axios的实例代码
2017/06/21 Javascript
jQuery实现html双向绑定功能示例
2017/10/09 jQuery
javascript实现最长公共子序列实例代码
2018/02/05 Javascript
解决vue A对象赋值给B对象,修改B属性会影响到A的问题
2018/09/25 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
Python中的MongoDB基本操作:连接、查询实例
2015/02/13 Python
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
举例讲解如何在Python编程中进行迭代和遍历
2016/01/19 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
python列表的增删改查实例代码
2018/01/30 Python
python矩阵的转置和逆转实例
2018/12/12 Python
Python_查看sqlite3表结构,查询语句的示例代码
2019/07/17 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
Django 项目布局方法(值得推荐)
2020/03/22 Python
python录音并调用百度语音识别接口的示例
2020/12/01 Python
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
毕业生自荐信
2013/12/14 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书
Anaconda安装pytorch及配置PyCharm 2021环境
2021/06/04 Python
一文带你探究MySQL中的NULL
2021/11/11 MySQL