PHP异常与处理
1.什么是异常
异常指的是程序运行中发生的一些我们不希望发生的事情。程序发生错误,这显然是我们不希望发生的事情,所以异常包括的范围实际上要比错误更广泛一些。
比如函数得到了一个我们意料之外的参数,这就是一个异常,而非错误。
2.异常处理
1 <?php 2 class myday 3 { 4 public function getup($f=1) 5 { 6 if($f) 7 { 8 echo "正常起床<br>"; 9 } 10 else 11 { 12 echo "我起不来<br>"; 13 echo "打电话请假吧"; 14 } 15 } 16 public function gotowork($f=1) 17 { 18 if($f==1) 19 { 20 echo "步行去上班<br>"; 21 } 22 elseif ($f==2) 23 { 24 echo "坐地铁去上班<br>"; 25 } 26 elseif ($f==3) 27 { 28 echo "做出租去上班<br>"; 29 } 30 else 31 { 32 echo "我不知道怎么去上班<br>"; 33 echo "打电话请假"; 34 } 35 } 36 public function work($f=1) 37 { 38 if($f) 39 { 40 echo "到达公司,开始工作<br>"; 41 } 42 else 43 { 44 echo "没能到达公司<br>"; 45 echo "打电话请假吧"; 46 } 47 } 48 }; 49 $p=new myday(); 50 $p->getup(); 51 $p->gotowork(); 52 $p->work(); 53 ?>
看上面代码,没有什么值得注意的对吧。其实这段代码中已经有了异常处理的思想了。每一个esle从句,实际上都是一个异常处理,用于处理一个我们不希望得到的参数。
但是这样做是不够好的,如果我们希望将异常的处理从函数体类分离出来,应该这样做
1 <?php 2 class myday 3 { 4 public function getup($f=1) 5 { 6 if($f) 7 { 8 echo "正常起床<br>"; 9 } 10 else 11 { 12 throw new Exception("没能正常起床", 1); 13 14 } 15 } 16 public function gotowork($f=1) 17 { 18 if($f==1) 19 { 20 echo "步行去上班<br>"; 21 } 22 elseif ($f==2) 23 { 24 echo "坐地铁去上班<br>"; 25 } 26 elseif ($f==3) 27 { 28 echo "做出租去上班<br>"; 29 } 30 else 31 { 32 throw new Exception("不知道怎么去上班", 1); 33 } 34 } 35 public function work($f=1) 36 { 37 if($f) 38 { 39 echo "到达公司,开始工作<br>"; 40 } 41 else 42 { 43 throw new Exception("没到达公司", 1); 44 } 45 } 46 }; 47 $p=new myday(); 48 try 49 { 50 $p->getup(); 51 $p->gotowork(0); 52 $p->work(); 53 } 54 catch(Exception $e) 55 { 56 echo $e->getMessage(); 57 echo "打电话请假"; 58 } 59 60 61 ?>
这样一来,只需要在函数体中做一个异常的判断,而异常的处理就可以在函数体之外进行了。
但是上面,对于发生的异常我们都有同样的处理方法,就是“打电话请假”,那么如果对于不同的异常有不同的处理该怎么办呢?
是的,你应该想到了,多些几个try{}catch{}从句就可以了
1 try 2 { 3 $p->getup(); 4 } 5 catch(Exception $e) 6 { 7 echo $e->getMessage(); 8 echo "不能起床,解决办法"; 9 } 10 try 11 { 12 $p->gotowork(); 13 } 14 catch(Exception $e) 15 { 16 echo $e->getMessage(); 17 echo "不知道坐车,解决办法"; 18 } 19 20 try 21 { 22 $p->gotowork(0); 23 } 24 catch(Exception $e) 25 { 26 echo $e->getMessage(); 27 echo "没能到公司,解决办法"; 28 }
但是这并不是很好的方法,更符合逻辑的方法是,对于不同的异常抛出不同的异常对象
<?php class getupex extends Exception { public function solve() { echo "不能起床,解决一下"; } } class gotowex extends Exception { public function solve() { echo "不知道怎么坐车,解决一下"; } } class workex extends Exception { public function solve() { echo "没到公司,解决一下"; } } /************************************************/ class myday { public function getup($f=1) { if($f) { echo "正常起床<br>"; } else { throw new getupex("没能正常起床", 1); } } public function gotowork($f=1) { if($f==1) { echo "步行去上班<br>"; } elseif ($f==2) { echo "坐地铁去上班<br>"; } elseif ($f==3) { echo "做出租去上班<br>"; } else { throw new gotowex("不知道怎么去上班", 1); } } public function work($f=1) { if($f) { echo "到达公司,开始工作<br>"; } else { throw new workex("没到达公司", 1); } } }; $p=new myday(); try { $p->getup(); $p->gotowork(); $p->work(); } catch(Exception $e) { echo $e->getMessage(); echo $e->solve(); } ?>
这样一来就非常好了
如果遇到更加离谱的异常,比如调用函数时不按规定传入了多个参数呢。对于这个实际上已经达到了错误的级别了。这时PHP会向页面或日志输出错误报告。
但是有些这种错误是我们可以处理的了,我们希望发生这种错误时一并交给错误处理函数来处理。这应该怎么做呢,该怎么在合适的时候抛出异常呢
1 set_error_handler('error_hand'); 2 function error_hand($level,$message,$file,$line) 3 { 4 if($line==82) throw new getupex("没能正常起床", 1); 5 elseif ($line==83) throw new gotowex("不知道怎么去上班", 1); 6 elseif ($line==84) throw new workex("没到达公司", 1); 7 }
这里用到了错误处理函数,这样一来就可以在发生错误时,自动抛出异常交给异常处理函数去处理了,其中$line用来判断错误发生的行数。