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 相关文章推荐
apache rewrite_module模块使用教程
Jan 10 PHP
php 安全过滤函数代码
May 07 PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
May 17 PHP
php设计模式 Decorator(装饰模式)
Jun 26 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
Dec 29 PHP
PHP sprintf() 函数的应用(定义和用法)
Jun 29 PHP
php基础教程 php内置函数实例教程
Aug 21 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
May 23 PHP
解析php addslashes()与addclashes()函数的区别和比较
Jun 24 PHP
php日历制作代码分享
Jan 20 PHP
php cli换行示例
Apr 22 PHP
PHP xpath提取网页数据内容代码解析
Jul 16 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获取浏览器信息类和客户端地理位置的2个方法
2014/04/24 PHP
PHP中使用虚代理实现延迟加载技术
2014/11/05 PHP
使用PHP实现阻止用户上传成人照片或者裸照
2014/12/25 PHP
php简单操作mysql数据库的类
2015/04/16 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
2017/03/16 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
JavaScript中的console.group()函数详细介绍
2014/12/29 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
2016/06/08 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
AngularJS实现Input格式化的方法
2016/11/07 Javascript
javascript事件的绑定基础实例讲解(34)
2017/02/14 Javascript
Angular.js指令学习中一些重要属性的用法教程
2017/05/24 Javascript
详解前后端分离之VueJS前端
2017/05/24 Javascript
详解webpack 多入口配置
2017/06/16 Javascript
Vue精简版风格概述
2018/01/30 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
JS简单表单验证功能完整示例
2020/01/26 Javascript
JavaScript 事件代理需要注意的地方
2020/09/08 Javascript
[26:52]LGD vs EG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
教你使用python实现微信每天给女朋友说晚安
2018/03/23 Python
python字典嵌套字典的情况下找到某个key的value详解
2019/07/10 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
SHEIN台湾:购买最新流行女装服饰
2019/05/18 全球购物
澳大利亚头发和美容产品购物网站:OZ Hair & Beauty
2020/03/27 全球购物
服务生自我鉴定
2014/01/22 职场文书
2014升学宴答谢词
2014/01/26 职场文书
酒店销售经理岗位职责
2014/01/31 职场文书
2014旅游局领导班子四风问题对照检查材料思想汇报
2014/09/19 职场文书
对学校的意见和建议
2015/06/04 职场文书
Java实现经典游戏泡泡堂的示例代码
2022/04/04 Java/Android