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
PHP开启gzip页面压缩实例代码
Mar 11 PHP
PHP与SQL注入攻击防范小技巧
Sep 16 PHP
PHP无限分类(树形类)
Sep 28 PHP
php利用curl抓取新浪微博内容示例
Apr 27 PHP
php实现指定字符串中查找子字符串的方法
Mar 17 PHP
简单的php+mysql聊天室实现方法(附源码)
Jan 05 PHP
基于thinkPHP框架实现留言板的方法
Oct 17 PHP
PHP抓取远程图片(含不带后缀的)教程详解
Oct 21 PHP
Laravel框架模板继承操作示例
Jun 11 PHP
PDO::_construct讲解
Jan 27 PHP
在laravel框架中实现封装公共方法全局调用
Oct 14 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/03/05 PHP
smarty内置函数config_load用法实例
2015/01/22 PHP
php使用Jpgraph绘制3D饼状图的方法
2015/06/10 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
2015/12/09 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
PHP实现的简单适配器模式示例
2017/06/22 PHP
使用PHP+MySql实现微信投票功能实例代码
2017/09/29 PHP
JS解决url传值出现中文乱码的另类办法
2013/04/08 Javascript
JavaScript实现GriwView单列全选(自写代码)
2013/05/13 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
jQuery判断数组是否包含了指定的元素
2015/03/10 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
前端开发必知的15个jQuery小技巧
2017/01/22 Javascript
webstrom Debug 调试vue项目的方法步骤
2018/07/17 Javascript
详解关于Vue版本不匹配问题(Vue packages version mismatch)
2018/09/17 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
JQuery实现折叠式菜单的详细代码
2020/06/03 jQuery
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
解决await在forEach中不起作用的问题
2021/02/25 Javascript
[00:50]深扒TI7聊天轮盘语音出处6
2017/05/11 DOTA
Python牛刀小试密码爆破
2011/02/03 Python
python模糊图片过滤的方法
2018/12/14 Python
Python魔法方法功能与用法简介
2019/04/04 Python
Django 源码WSGI剖析过程详解
2019/08/05 Python
Python嵌套函数,作用域与偏函数用法实例分析
2019/12/26 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
网络安全方面的面试题
2016/01/07 面试题
租房协议书范本
2014/04/09 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
实习协议书
2015/01/27 职场文书
爱晚亭导游词
2015/02/09 职场文书
Mac M1安装mnmp (Mac+Nginx+MySQL+PHP) 开发环境
2021/03/29 PHP
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫