php抛出异常与捕捉特定类型的异常详解
什么是异常?
PHP5提供了一种新的面向对象的错误处理方法。
异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。
当异常被触发时,通常会发生:
当前代码状态被保存
代码执行被切换到预定义的异常处理器函数
根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本
我们将展示不同的错误处理方法:
异常的基本使用
创建自定义的异常处理器
多个异常
重新抛出异常
设置顶层异常处理器
php抛出异常与捕捉特定类型的异常最终的目的还是要给出对应的解决办法,让代码可以继续运行。
本文的测试环境:PHP5.5.36 Safari9.1.2
1<?php 2header("content-type:text/html;charset=utf-8"); 3/** 4*包裹重量异常 5*/ 6classHeavyParcelExceptionextendsException{} 7 8/** 9*包裹类 10*/ 11classParcel{ 12 13/** 14*包裹寄送目的地地址 15*/ 16public$address; 17 18/** 19*包裹重量 20*/ 21public$weight; 22} 23 24/** 25*派送员 26*/ 27classCourier{ 28 29/** 30*运送 31*/ 32publicfunctionship(Parcel$parcel){ 33//checkwehaveanaddress 34//如果包裹的目的地为空 35if(empty($parcel->address)){ 36thrownewException('addressnotSpecified(未填写地址)!'); 37} 38 39//checktheweight 40//如果重量超过5 41if($parcel->weight>5){ 42thrownewHeavyParcelException('Parcelexceedscourierlimit(包裹超过运送上限)!'); 43} 44 45//otherwisewe'recoll 46returntrue; 47} 48} 49 50$myCourier=newCourier(); 51$parcel=newParcel(); 52//addtheaddressifwehaveit为了测试这里不填写地址 53$parcel->weight=7; 54try{ 55$myCourier->ship($parcel); 56echo"parcelshipped"; 57}catch(HeavyParcelException$e){//捕获HeavyParcelException不写这个异常的类型名字,就跑到普通Exception抛出去了 58echo"Parcelweighterror(重量错误):".$e->getMessage(); 59//redirectthemtochooseanothercourier 60}catch(Exception$e){ 61echo"Sometingwentwrong(地址错误):".$e->getMessage(); 62//exitsowedon'ttrytoproceedanyfurther 63exit; 64} 65echo'<br/>'; 66$a=123; 67echo$a;
从54行开始的代码执行顺序:
55>
32>
35(ship方法中先检查的是地址为空,这里会抛出Exception,而非57行的HeavyParcelException)>
60(捕获到Exception)>
616263输出地址错误exit;不会输出65到67行了
Tips:
我感觉这一块最重要的就是搞清楚代码执行的顺序。写几段,然后改一改跑一跑。
1.捕获的顺序,要看try中的代码中throw的是哪个类型的Exception,然后才看catch里的顺序。
2.57行的捕获的是特定的类型HeavyParcelException不能写错,或写Exception都会有问题。可以自己试试。
1)例如地址不为空,57行写成了HeavyParcelException111,就会,在60行它的父类对象中捕获到,重量错误。这不是我们想要的。
2)例如地址为空,57行写成了Exception,会抛出地址错误,但捕获的却是本来负责重量的catch。这也不是我们想要的。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。