php抛出异常与捕捉特定类型的异常详解


Posted in PHP onOctober 26, 2016

什么是异常?

PHP 5 提供了一种新的面向对象的错误处理方法。

异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。

当异常被触发时,通常会发生:

      当前代码状态被保存

      代码执行被切换到预定义的异常处理器函数

      根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本

我们将展示不同的错误处理方法:

      异常的基本使用

      创建自定义的异常处理器

      多个异常

      重新抛出异常

      设置顶层异常处理器

php抛出异常与捕捉特定类型的异常最终的目的还是要给出对应的解决办法,让代码可以继续运行。

本文的测试环境:PHP5.5.36  Safari 9.1.2

1 <?php
 2 header("content-type:text/html; charset=utf-8");
 3 /**
 4 * 包裹重量异常
 5 */
 6 class HeavyParcelException extends Exception {}
 7 
 8 /**
 9 * 包裹类
10 */
11 class Parcel {
12 
13   /**
14   * 包裹寄送目的地地址
15   */
16   public $address;
17 
18   /**
19   * 包裹重量
20   */
21   public $weight;
22 }
23 
24 /**
25 * 派送员
26 */
27 class Courier {
28  
29   /** 
30   * 运送
31   */
32   public function ship(Parcel $parcel) {
33     //check we have an address
34     //如果包裹的目的地为空
35     if(empty($parcel->address)) {
36       throw new Exception('address not Specified(未填写地址)!');
37     } 
38 
39     //check the weight
40     //如果重量超过5
41     if($parcel->weight > 5) {
42       throw new HeavyParcelException('Parcel exceeds courier limit(包裹超过运送上限)!');
43     } 
44 
45     //otherwise we're coll
46     return true;
47   }
48 }
49 
50 $myCourier = new Courier();
51 $parcel = new Parcel();
52 //add the address if we have it 为了测试这里不填写地址
53 $parcel->weight = 7;
54 try {
55   $myCourier->ship($parcel);
56   echo "parcel shipped";
57 } catch (HeavyParcelException $e) {//捕获HeavyParcelException 不写这个异常的类型名字,就跑到普通Exception抛出去了
58   echo "Parcel weight error(重量错误): " . $e->getMessage();
59   //redirect them to choose another courier
60 } catch (Exception $e) {
61   echo "Someting went wrong(地址错误): " . $e->getMessage();
62   //exit so we don't try to proceed any further
63   exit;
64 }
65 echo '<br/>';
66 $a = 123;
67 echo $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。这也不是我们想要的。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

PHP 相关文章推荐
php中将数组存到文件里的实现代码
Jan 19 PHP
PHP原生模板引擎 最简单的模板引擎
Apr 25 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
Sep 23 PHP
php和js如何通过json互相传递数据相关问题探讨
Feb 26 PHP
XAMPP安装与使用方法详细解析
Nov 27 PHP
php设计模式之单例模式使用示例
Jan 20 PHP
php根据操作系统转换文件名大小写的方法
Feb 24 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
Jun 21 PHP
PHP闭包函数详解
Feb 13 PHP
Symfony2之session与cookie用法小结
Mar 18 PHP
PHP使用标准库spl实现的观察者模式示例
Aug 04 PHP
PHP面向对象程序设计继承用法简单示例
Dec 28 PHP
php array_map使用自定义的函数处理数组中的每个值
Oct 26 #PHP
AES加解密在php接口请求过程中的应用示例
Oct 26 #PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
Oct 25 #PHP
在Thinkphp中使用ajax实现无刷新分页的方法
Oct 25 #PHP
PHP上传Excel文件导入数据到MySQL数据库示例
Oct 25 #PHP
详解PHP中foreach的用法和实例
Oct 25 #PHP
php array_keys 返回数组的键名
Oct 25 #PHP
You might like
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
js中获取事件对象的方法小结
2011/03/13 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
javascript针对不确定函数的执行方法
2015/12/16 Javascript
jQuery实现的文字hover颜色渐变效果实例
2016/02/20 Javascript
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
非常优秀的JS图片轮播插件Swiper的用法
2017/01/03 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
2017/05/12 Javascript
微信小程序实现多个按钮toggle功能的实例
2017/06/13 Javascript
基于JS实现仿京东搜索栏随滑动透明度渐变效果
2017/07/10 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
webpack打包nodejs项目的方法
2018/09/26 NodeJs
vue2.0基于vue-cli+element-ui制作树形treeTable
2019/04/30 Javascript
Vue 前端实现登陆拦截及axios 拦截器的使用
2019/07/17 Javascript
[44:40]Serenity vs Pain 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[01:04:08]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第一场 12.16
2020/12/18 DOTA
Python多进程机制实例详解
2015/07/02 Python
python实现批量注册网站用户的示例
2019/02/22 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
Python绘图实现台风路径可视化代码实例
2020/10/23 Python
CSS3中:nth-child和:nth-of-type的区别深入理解
2014/03/10 HTML / CSS
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
Perry Ellis官网:美国男士品味服装
2016/12/09 全球购物
Ashford台湾:以折扣价提供奢华的男女用表款
2019/12/04 全球购物
Bonprix法国:时尚、鞋子、家居
2020/12/29 全球购物
计算 s=(x*y)1/2,用两个宏定义来实现
2016/08/11 面试题
工伤赔偿协议书范本
2014/04/15 职场文书
白岩松演讲
2014/05/21 职场文书
质量承诺书怎么写
2014/05/24 职场文书
超市客服工作职责
2014/06/11 职场文书
环境科学专业求职信
2014/08/04 职场文书
2014年关工委工作总结
2014/11/17 职场文书
MySQL实现字段分割一行转多行的示例代码
2022/07/07 MySQL