通常我们希望封装好的类是完整和独立的,不需要从外部干预内部代码的执行,所以依赖程序员另外写代码测试一个类中的方法是否出错,这是非常不合理的。
我们需要把错误处理的责任集中放在类的内部,而不能依赖于调用该类的程序员和外部代码,因为通常使用该类的程序员并不知道怎么处理类内部的方法所引发的错误。
< ?phpclass Server{ function __construct($file) { $this->file = $file; if(!file_exists($file)){ throw new Exception("file '$file' does not exist."); } }}class Client{ static function init() { try{ $conf = new Server(dirname(__FILE__)."/conf01.xml"); //测试用例 $conf->write(); }catch(Exception $e){ print $e; //这里可以打印错误或者做其他事情 } }}Client::init();?>
当抛出异常的时候,调用作用域中国的catch子句会被调用,自动将Exception对象作为参数传入因为异常抛出时会停止执行类的方法,所以此时控制权从try子句移交到catch子句
不过有个问题,就是每次只能获取一个error,因为即使写多了判断然后throw,但也是只能catch一个,毕竟都不能区分,所以需要做一些处理
< ?phpclass Server { function __construct($file) { $this->file = $file; if(!file_exists($file)){ throw new FileException("file '$this->file' does not exist."); } } function write() { if(! is_writable($this->file)){ throw new BadException("file '$this->file' is bad."); //测试我将文件改成不能写的权限 chmod 000 conf01.xml } }}class BadException extends Exception{ //需要创建一个新的Exception类,名字是可以diy的,不过需要继承Exception类}class Client{ static function init() { try{ $conf = new Server(dirname(__FILE__)."/conf01.xml"); $conf->write(); }catch(FileException $e){ print $e; }catch(BadException $e){ //这里只执行了一个Exception,不过也是我们的目标的BadException print $e; }catch(Exception $e){ //这里是为了做后备,为了获取一些其他不能确认的Exception print $e; } }}Client::init();?>
结果输出:
exception 'BadException' with message 'file 'Downloads/conf01.xml' is bad.' in Downloads/Untitled.php:15Stack trace:#0 Downloads/Untitled.php(28): Server->write()#1 /Downloads/Untitled.php(39): Client::init()#2 {main}
需要注意的是,catch是会按照顺序来匹配的,如果前一个被匹配了,后面都就不会被触发。
< ?phpclass Server { function __construct($file) { $this->file = $file; if(!file_exists($file)){ throw new FileException("file '$this->file' does not exist."); } } function write() { if(! is_writable($this->file)){ throw new BadException("file '$this->file' is not writeable."); } if(! is_readable($this->file)){ throw new SpecilException($this->file); } }}class BadException extends Exception{}class SpecilException extends Exception{ function __construct($file){ //这里可以创建一些自己的Exception规则,而不单纯是支持打印错误 echo "this is a Specil error,'$file' is not readable"; }}class Client{ static function init() { try{ $conf = new Server(dirname(__FILE__)."/conf01.xml"); $conf->write(); }catch(FileException $e){ print $e; }catch(BadException $e){ print $e; }catch(SpecilException $e){ //我将测试文件改成不能读的状态来测试 print $e; }catch(Exception $e){ print $e; } }}Client::init();?>
输出结果:
this is a Specil error,'/Downloads/conf01.xml' is not readableexception 'SpecilException' in/Downloads/Untitled.php:19Stack trace:#0 /Downloads/Untitled.php(40): Server->write()#1 /Downloads/Untitled.php(53): Client::init()#2 {main}