php抛出异常及捕捉特定类型异常解决思路是什么?异常捕获在现在不少的ide工具中都能够用快捷键很方便的添加上,防止用户看到自己看不懂的报错甚至莫名其妙崩溃,导致用户体验不好。即使是显示一个友好一些的崩溃提示,也比直接显示error:xxxx xxxxxxxxx要好的多。今天给各位编程爱好者带来的是php如何抛出异常与捕捉特定类型的异常实例,有兴趣的朋友来详细了解一下吧。

什么是异常?

PHP5 提供了一种新的面向对象的错误处理办法。

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

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

当前代码状态被保存

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

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

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

异常的基本使用

创建自定义的异常处理器

多个异常

重新抛出异常

设置顶层异常处理器

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 '
';

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抛出异常及捕捉特定类型异常解决办法相关推荐

  1. 以下python语言关键字在异常处理_【单选题】以下 Python 语言关键字在异常处理结构中用来捕获特定类型异常的选项是: ( )...

    问题:[单选题]以下 Python 语言关键字在异常处理结构中用来捕获特定类型异常的选项是: ( ) 更多相关问题 进程从运行状态变为等待的原因可能是() 进程调度主要负责() 在下列叙述中,错误的一 ...

  2. HTML页面加载异常,按F12调试后居然又好了的解决办法!

    HTML页面加载异常,按F12调试后居然又好了的解决办法! 参考文章: (1)HTML页面加载异常,按F12调试后居然又好了的解决办法! (2)https://www.cnblogs.com/Jaco ...

  3. python异常处理时所使用的保留字_下列Python保留字中,用于异常处理结构中用来捕获特定类型异常的是...

    [单选题]以下不是 Python 语言关键字的选项是 [单选题]给出下面代码: a = input("").split(",") x = 0 while x & ...

  4. 下列python保留字中、用于异常处理_下列Python保留字中,用于异常处理结构中用来捕获特定类型异常的是...

    下列Python保留字中,用于异常处理结构中用来捕获特定类型异常的是 答:except 在罗马共和国后期,西班牙地区被凯撒征服并占领了.() 答:× 维拉帕米不用于治疗 答:慢性心功能不全 按照交通环 ...

  5. php公众号单图文不显示大图,公众号封面图全部显示异常? 微信这又是在憋什么大招呢! (内附有解决办法)...

    原标题:公众号封面图全部显示异常? 微信这又是在憋什么大招呢! (内附有解决办法) 1月16日下午3:30左右,很多用户反映,在手机上看公众号文章时,各大知名自媒体公众号的推文封面都显示不了,微信公众 ...

  6. 异常“只能在执行Render()的过程中调用RegisterForEventValidation”的解决办法(转)...

    当出现下面的异常的时候: 只能在执行Render()的过程中调用RegisterForEventValidation 当出现的异常的提示: 异常详细信息: System.InvalidOperatio ...

  7. 打包时出现的异常。XXXXXXX-1.0-SNAPSHOT.jar中没有主清单属性的解决办法

    打包时异常信息如下: Some problems were encountered while building the effective model for com.llq:redis:jar:1 ...

  8. [乐意黎原创]PHP启用session后抛 session_start(): open(/var/lib/php/session/sess_... 的解决办法

    如题,PHP启用SESSION后抛 Warning: session_start(): open(/var/lib/php/session_user/sess_d5gn9q7q9qii26ajk2c8 ...

  9. postfix和dovecot服务异常,重启服务后又会自动停掉的解决办法

    1.首先排除/var/log/mailog日志,但是发现是空的. 2.查看rsyslog日志配置文件,主要注意$IncludeConfig和mail这两行. [root@gxm log]# vi /e ...

最新文章

  1. 员工培训:如何制定以数据为依据的业务决策
  2. 使用 Visual Studio Code 进行远程开发
  3. LeetCode 942. 增减字符串匹配
  4. C++是一种糟糕的语言 Linux之父炮轰C++
  5. Raid 原理及创建软raid
  6. activemq mysql 配置详解_activeMQ数据库配置
  7. ​Web安全测试解决方案
  8. shell脚本备份数据库
  9. 非模块化jar的模块化转换
  10. 深入理解操作系统原理之操作系统概述
  11. winForm中 Invalidate(),Update(),Reflash(),
  12. CSS垂直居中img
  13. H-Chat: socket.io实现私聊,群聊,添加好友
  14. 听说股票是暴利?花了一晚上时间,用Python写了个股票提醒系统
  15. 51单片机之模拟IIC总线
  16. win32简单只读文件程序
  17. 如何写使用说明书或使用手册
  18. el-form表单对象内还嵌套对象,绑定的prop规则校验会失效
  19. Tableau数据分析数据可视化分析平台
  20. 怎么定位门面位置_如何选择店面位置

热门文章

  1. PureMVC(JS版)源码解析(五):SimpleCommand类
  2. gradle配置环境变量
  3. 在Mac下使用Lemon
  4. 一线游戏开发员揭秘薪酬
  5. My Twenty-Eighth Page - 滑动窗口最大值 - By Nicolas
  6. 最新版ui成语填空答题,成语接龙小程序源码,修复登录接口问题
  7. AI似乎比我们还想赢?玩游戏大玩BUG
  8. 从今年的病毒发作情况看计算机病毒发展趋势(转)
  9. 给出年月日计算该天是该年的第几天(大学C语言练习
  10. k8s教程(基础篇)-总纲