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
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
Jul 01 PHP
php中根据变量的类型 选择echo或dump
Jul 05 PHP
PHP $_FILES中error返回值详解
Jan 30 PHP
php获取访问者IP地址汇总
Apr 24 PHP
PHP批量去除BOM头代码分享
Jun 26 PHP
php里array_work用法实例分析
Jul 13 PHP
PHP在线打包下载功能示例
Oct 15 PHP
微信自定义分享php代码分析
Nov 24 PHP
php结合redis高并发下发帖、发微博的实现方法
Dec 15 PHP
PHP实现合并两个排序链表的方法
Jan 19 PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
Oct 25 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快速查找数据库中恶意代码的方法
2015/04/01 PHP
PHP编程获取各个时间段具体时间的方法
2017/05/26 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
2017/07/16 PHP
php-fpm添加service服务的例子
2018/04/27 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
js 如何实现对数据库的增删改查
2012/11/23 Javascript
jquery live()调用不存在的解决方法
2014/02/26 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
获取select的value、text值的简单示例(jquery与javascript)
2016/12/07 Javascript
jQuery插件zTree实现的基本树与节点获取操作示例
2017/03/08 Javascript
基于jQuery实现无缝轮播与左右点击效果
2018/05/13 jQuery
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
2020/08/31 Javascript
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
详解Python的Django框架中的templates设置
2015/05/11 Python
利用python将图片转换成excel文档格式
2017/12/30 Python
python 通过 socket 发送文件的实例代码
2018/08/14 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
2019/08/20 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
CSS3制作圆角图片和椭圆形图片
2016/07/08 HTML / CSS
HTML5中使用json对象的实例代码
2018/09/10 HTML / CSS
最耐用行李箱,一箱永流传:Briggs & Riley(全球终身保修)
2017/12/07 全球购物
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
安全保证书范文
2014/04/29 职场文书
体育教师求职信
2014/05/24 职场文书
质量承诺书怎么写
2014/05/24 职场文书
模具专业求职信
2014/06/26 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
出生证明格式
2015/06/15 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python
Vue Element-ui表单校验规则实现
2021/07/09 Vue.js