普通处理方法
//两个串联开关,需要同时打开才能开灯,该方法扩展性比较差,如果是3个串联开关呢? function A(){ $res1 = power1(1); $res2 = power2(0); if ($res1 && $res2){ echo '成功打开'; }else{ echo '打开失败'; } } function power1($num){ if ($num == 1){ return true; }else{ return false; } } function power2($num){ if ($num == 1){ return true; }else{ return false; } } A();使用异常处理
//使用异常处理,可以更有效的控制错误,在开发中大量使用 try{ power1(0); power2(0); } //捕获异常 catch (Exception $e){ // 异常信息:power2未接通 echo '异常信息:'.$e->getMessage(); } function power1($num){ if (!($num == 1)){ //抛出异常,并作为函数的返回值返回 throw new Exception('power1未接通'); } } function power2($num){ if (!($num == 1)){ //抛出异常,并作为函数的返回值返回 throw new Exception('power2未接通'); } }php内置异常处理类
class Exception { protected $message = 'Unknown exception' ; // 异常信息 private $string ; // __toString cache protected $code = 0 ; // 用户自定义异常代码 protected $file ; // 发生异常的文件名 protected $line ; // 发生异常的代码行号 private $trace ; // backtrace private $previous ; // previous exception if nested exception public function __construct ( $message = null , $code = 0 , Exception $previous = null ); final private function __clone (); // Inhibits cloning of exceptions. final public function getMessage (); // 返回异常信息 final public function getCode (); // 返回异常代码 final public function getFile (); // 返回发生异常的文件名 final public function getLine (); // 返回发生异常的代码行号 final public function getTrace (); // backtrace() 数组 final public function getPrevious (); // 之前的 exception final public function getTraceAsString (); // 已格成化成字符串的 getTrace() 信息 // Overrideable public function __toString (); // 可输出的字符串 }当异常被抛出后,try{ } 里的后续代码就不会执行了,php会尝试查找匹配的 catch 代码块
try{ echo '111<br>'; power1(1); echo '222<br>'; power2(0); echo '333<br>'; } catch (Exception $e){ echo '异常信息:'.$e->getMessage(); } function power1($num){ if (!($num == 1)){ throw new Exception('power1未接通'); } } function power2($num){ if (!($num == 1)){ throw new Exception('power2未接通'); } } /* 111 222 异常信息:power2未接通*/如果捕获到的异常无法处理,可以继续抛出,这时将启用php默认的异常处理器处理
try{ power1(1); power2(0); } catch (Exception $e){ //如果捕获到的异常无法处理,可以继续抛出,这时将启用php默认的异常处理器处理 //也可以自定义一个顶级异常处理器处理 throw $e; } function power1($num){ if (!($num == 1)){ throw new Exception('power1未接通'); } } function power2($num){ if (!($num == 1)){ throw new Exception('power2未接通'); } } //Fatal error: Uncaught exception 'Exception' with message 'power2未接通' //类似于以下代码,都是由php默认的异常处理器处理的 /* function power1($num){ if (!($num == 1)){ throw new Exception('power1未接通'); } } function power2($num){ if (!($num == 1)){ throw new Exception('power2未接通'); } } power2(0); //Fatal error: Uncaught exception 'Exception' with message 'power2未接通' */下面代码能抓住异常吗? 否
php只有throw抛出异常,catch才能抓住异常,这里的错误交给了默认的错误处理机制处理
try{ //$i = 8/0; $file = fopen('aaa.txt','r'); } catch (Exception $e){ echo 'ok'.$e->getMessage(); } //Warning: Division by zero in F:\wamp\www\test1.php on line 5