多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
在PHP中或其他任何语言中,异常和错误的概念都是不一样的。 PHP中遇到非正常代码,通常都会触发错误,而不是抛出异常。 ``` <?php /** * User: 三千 * Date: 16/4/13 * Time: 上午11:31 */ $a = null; try{ $a = 5 / 1; echo $a,PHP_EOL; }catch(exception $e){ $e->getMessage(); $a = -1; } echo $a; ``` 结果: ``` changzuxindeMacBook-Pro% php 1.6.1_1.php Warning: Division by zero in /Users/changzuxin/www/code/php_core/1.6.1_1.php on line 10 ``` 可以看到,对于除0这种异常情况,PHP认为这是一个错误,直接触发错误,而不会自动抛出异常使程序进入异常流程,所以如果想使用异常处理不可预料的问题,是办不到的。 PHP中只有你主动throw后,才能捕捉异常。 比如说: ``` <?php /** * User: 三千 * Date: 16/4/13 * Time: 上午11:12 */ class emailException extends Exception{ } class pwdException extends Exception{ function __toString(){ return "Exception{$this->getCode}:{$this->getMessage()} \n in File:{$this->getFile()} on line :{$this->getLine()}"; } } function reg($reginfo = null){ if(empty($reginfo) || !isset($reginfo)){ throw new Exception("参数非法"); } if(empty($reginfo['email'])){ throw new emailException("邮件为空"); } if($reginfo['pwd'] != $reginfo['repwd']){ throw new pwdException("两次密码不一致"); } echo "注册成功"; } ``` 上面的代码判断传入的参数,根据业务进行异常分发。如果没有传入任何参数,就把异常分发给exception超类,跳出注册流程,如果email地址不存在,那么把异常分发给自定义的emailException异常,跳出注册流程;如果两次密码不一致,则将异常分发给自定义的pwdException异常,跳出注册流程。 异常分发完之后,在对异常进行分拣并做处理。 ``` try{ reg(array('email'=>'','pwd'=>123,'repwd'=>456)); }catch(emailException $e){ echo $e->getMessage(); }catch(pwdException $e){ echo $e; echo PHP_EOL,'特殊处理'; }catch(Exception $e){ echo $e->getTraceAsString(); echo PHP_EOL,'其他情况,统一处理'; } ``` 结果 ``` changzuxindeMacBook-Pro% php 1.6.1_2.php 邮件为空% ``` 注意,exception作为超类应该放在最后捕获。不然捕获这个异常超类后,后面的捕获就终止了,而这个超类不能提供针对性的信息和处理。 在这里,对表单进行异常处理,通过重写异常类、手动抛出错误的方式进行异常处理。这是一种业务异常,可以认为地把所有不符合要求的情况都试作业务异常,和通常意义上的代码异常相区别。 在PHP中异常该怎么用?在什么时候抛出异常,什么时候捕获?什么场景下能应用异常?在下面三种场景下会用到异常处理机制。 - 对程序的悲观预测 - 程序的需要和对业务的关注 - 语言级别的健壮性要求 1.对程序的悲观预测 是指程序员认为他的代码无法一一处理各种可预见、不可预见的情况,那该程序员就会进行异常处理。假设一个场景,程序员悲观地认为自己的这段代码在高并发条件下产生死锁,那么他就会悲观地抛出异常,然后在死锁时进行捕获,对异常进行细致的处理。 2.程序的需要和对业务的关注 如果程序员希望业务代码中不会充斥