PHP-异常处理
异常是程序在执行过程中出现一个例外或一个事件,程序中断了正常的运行,跳转到程序的其它模块继续运行
PHP内置的异常处理类Exception
<?php /** * Author: MuT6 Sch01aR * Date: 2018/3/17 * Time: 12:28 */ class Exception{ protected $message = 'Unknown exception'; //异常信息 protected $code = 0; //用户自定义异常代码 protected $file; //发生异常的文件名 protected $line; //发生异常的代码行号 function __construct($message = null, $coed = 0){} //构造方法 final function getMessage(){} //返回异常信息 final function getCode(){} //返回异常代码 final function getFile(){} //返回发生异常的文件名 final function getLine(){} //返回发生异常的代码行号 final function getTrace(){} //获取异常追踪信息 final function getTraceAsString(){} //获取字符串类型的异常追踪信息 //可重载的方法 function __toString(){} //将异常对象转换为字符串 function __clone(){} //异常克隆 } ?>
实现异常处理
<?php /** * Author: MuT6 Sch01aR * Date: 2018/3/14 * Time: 22:37 */ function Guess_age($age){ if ($age > 120){ throw new Exception('年龄过大'); //需要将异常抛出 } else{ echo '年龄无误'; } } try{ echo "在异常被捕捉之前+\n"; Guess_age(121); echo '在异常被捕捉之后'; //如果遇到异常被捕捉了,就不会执行这句话 }catch(Exception $e){ echo $e->getMessage()."\n"; //打印抛出的信息 echo $e->getLine(); //打印哪一行异常 } ?>
运行结果
异常被捕捉到前的语句被执行了,异常被捕捉之后的语句没有执行
扩展异常处理类
我们可以扩展异常处理类来添加一些自定义的方法
<?php /** * Author: MuT6 Sch01aR * Date: 2018/3/14 * Time: 23:38 */ //继承父类Exception class My_Exception extends Exception{ function getinfo() //不能改写父类中的成员方法 { echo '这是My_Exception'; } } function Guess_age($age) { if ($age > 120) { throw new My_Exception('年龄过大'); } else { echo '年龄无误'; } } try{ Guess_age(121); }catch(My_Exception $e){ echo $e->getinfo()."\n"; echo $e->getMessage(); } ?>
运行结果
顶级异常处理器
catch捕捉到的异常,也可以继续抛出去交给系统的顶级异常处理器来处理
也可以自己定义一个顶级异常处理函数
<?php /** * Author: MuT6 Sch01aR * Date: 2018/3/14 * Time: 23:32 */ function My_Exception($e){ echo '当前为顶级异常处理函数:'.$e->getMessage(); } set_exception_handler('My_Exception'); function Guess_age($age){ if ($age > 120){ throw new Exception('年龄过大'); } else{ echo '年龄无误'; } } try{ Guess_age(121); }catch(Exception $e){ throw $e; //把异常抛给顶级异常处理函数来处理 } ?>
运行结果
处理多个异常
通过catch捕获多个异常,当try中抛出异常后,catch会捕捉相应的异常进行处理
<?php /** * Author: MuT6 Sch01aR * Date: 2018/3/14 * Time: 23:52 */ class My_Exception_1 extends Exception{ function getinfo() //不能改写父类中的成员方法 { echo '这是My_Exception_1'; } } class My_Exception_2 extends Exception{ function getinfo() //不能改写父类中的成员方法 { echo '这是My_Exception_2'; } } function Guess_Age($age){ if ($age > 120){ throw new My_Exception_1('年龄过大'); } else{ echo '年龄无误'; } } function Guess_Name($name){ if ($name != 'John'){ throw new My_Exception_2('名字错误'); }else{ echo '名字正确'; } } try{ Guess_Age(123); Guess_Name('Jack'); }catch(My_Exception_1 $e1){ echo $e1->getinfo().'-------'.$e1->getMessage()."\n"; }catch(My_Exception_2 $e2){ echo $e2->getinfo().'-------'.$e2->getMessage(); } ?>
运行结果
只捕捉到了第一个异常,因为try中有异常被捕捉后,后面的语句就不执行了