如何使用PHP的异常

很多同学不知道如何使用异常,以为只要if写好了代码就安全了。
下面就讲讲如何使用异常,什么时候该使用异常:

function getUserInfo($uid){
if(is_numeric($uid)){
return $this->db->fetch(“select * from user where uid=$uid”);
}else{
return false;
}
}
$uid = ‘a123’;
$userinfo = getUserInfo($uid);

这样的代码看上的确很完美了,但是我们不知道函数为什么返回false
于是我们开始各种猜测:是用户不存在吗?还是Sql写错了?还是数据库有问题?
其实是某个程序员在不小心在参数前多加了个a
好吧,我们来把这段代码改一下使他更加严谨

function getUserInfo($uid){
if(is_numeric($uid)){
$user = $this->db->fetch(“select * from user where uid=$uid”);
if(empty($user)){
throw new Exception(“用户$uid不存在”,102);
}else{
return $user;
}
}else{
throw new Exception(“$uid的值不是有效的数字”,101);
}
return false;
}

//捕捉异常
try{
$uid = ‘a123’;
$userinfo = getUserInfo($uid);
//处理异常
}catch(Exception $e){
if($e->getCode()==101){
//如果$_GET[‘uid’]不是安全的数字我们可以把它认为是某人在动歪脑筋
//那么把他的信息记录下来或者禁止他访问等等操作
error_log(‘error.log’,$e->getMessage().”记录客户端的IP 记录时间”);
}elseif($e->getCode()==102){
error_log(‘error.log’,$e->getMessage());
}
//处理数据库的异常
}catch(DBException $e){
//如果是DB错误则是个十分严重的错误,记录日志并发送邮件给管理员
error_log(‘error.log’,$e->getTraceAsString());
sendMail($to,$e->getTraceAsString());
}

这样就可以做到万无一失了,所以各位在写程序时不要偷懒。善用异常,把不可预知的问题交给异常处理可以使你的程序更加安全。

对于Rick提出的代码变得复杂,啰嗦了再补充一点:

function func1(){
if(false) return false;
}
function func2(){
if(func1() == false) return false
}
function func3(){
if(func2() == false) return false;
}
if(func3() == false){
exit(‘函数3出错了’);
}

这段代码我们必须判断每个调用的函数返回是否正确,而且最终只能知道是func3出错了。
那调试也需要一层一层的去找问题的根源。如果使用异常就能迅速找出问题的根源。

function func1(){
if(false) throw new Eception(‘函数1发生了错误’);
}
function func2(){
if(false) throw new Exception(‘函数2发生了错误’);
return func1();
}
function func3(){
if(false) throw new Exception(‘函数3发生了错误’);
return func2();
}

//使用异常捕捉能迅速知道是哪个函数出现了问题
//而且还可以在异常处理块中处理异常使程序自动恢复正常
try{
func3();
}catch(Exception $e){
error_log(‘error.log’,$e->getMessage());
}

本文固定链接: http://www.ccsbbs.com.cn/archives/5823.html | 极限手指

该日志由 极限手指 于2013年03月01日发表在 PHP 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 如何使用PHP的异常 | 极限手指

如何使用PHP的异常:等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!