热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

C++抛出和接收异常的顺序

这篇文章主要介绍了C++抛出和接收异常的顺序,帮助大家更好的理解和学习C++,感兴趣的朋友可以了解下

异常(exception)是C++语言引入的错误处理机制。它 采用了统一的方式对程序的运行时错误进行处理,具有标准化、安全和高效的特点。C++为了实现异常处理,引入了三个关键字:try、throw、catch。异常由throw抛出,格式为throw[expression],由catch捕捉。Try语句块是可能抛出异常的语句块,它通常和一个或多个catch语句块连续出现。

try语句块和catch语句块必须相互配合,以下三种情况都会导致编译错误:

 (1)只有try语句块而没有catch语句块,或者只有catch语句块而没有try语句块;
 (2)在try语句块和catch语句块之间夹杂有其他语句;
 (3)当try语句块后跟有多个catch语句块时,catch语句块之间夹杂有其他语句;
 (4)同一种数据类型的传值catch分支与传引用catch分支不能同时出现。

在抛出和接收异常的过程中,我们还要注意以下几点。

1.被抛出的异常对象什么时候被销毁?

用throw语句抛出一个对象时,会构造一个新的对象,这个对象就是异常对象。该对象的生命周期从被抛出开始计算,一直到被某个catch语句捕捉,就会在该catch语句块执行完毕后被销毁。考察如下程序。

#include 
using namespace std;

class ExClass
{
 int num;
public:
 ExClass(int i)
 {
 cout<<"Constructing exception object with num="<

程序输出结果是:

Constructing exception object with num=99
Copy Constructing exception object with num=100
Copy Constructing exception object with num=101
the number is 101
Destructing exception object with num=101
Destructing exception object with num=100
after catch
Destructing exception object with num=99

用throw语句抛出一个对象时,会构造一个新的对象,这个对象就是异常对象。该对象的生命周期从被抛出时开始计算,一直到被某个catch语句捕获,就会在该catch语句块执行完毕后被销毁。在上面的程序中,异常对象的num值为100,“Destructing exception object with num=100”这句话在“after catch”之前输出,正好说明异常对象的销毁时间是在它被捕获的catch块执行之后。

所以的catch分支在执行时类似一次函数调用,catch 的参数相当于函数的形参,而被抛出的异常对象相当于函数调用时的实参。当形参与实参成功匹配时,就说明异常被某个catch分支所捕获。catch后面的参数只能采用传值、传引用和传指针三种方式,如果采用传值方式,则会生成实参的一个副本,如果实参是一个对象,就会导致构造函数被调用。在上面的程序中,执行catch(ExClass e) 语句就是利用异常对象构造一个对象e,因此会调用拷贝构造函数。
 要注意的是:同一种数据类型的传值catch分支和传引用catch分支不能同时出现。

2.异常如果在当前函数没有被捕获会发生什么?

在某些情况下,可能所有的catch分支都无法捕获到抛出的异常,这将导致当前函数执行的结束,并返回到主调函数中。在主调函数中,将继续以上的捕捉异常的过程,直到异常被捕捉或最终结束整个程序。考察如下程序。

#include 
using namespace std;

class ExClass
{
 int num;
public:
 ExClass(int i)
 {
 cout<<"Constructing exception object with num="<

程序的输出结果:

Constructing exception object with num=199
Copy Constructing exception object with num=200
the number is 200
Destructing exception object with num=200
Destructing exception object with num=199
continue to execute

从程序的结果可以看出:

 (1)被抛出的异常对象的num值为199,由于它没有在函数throwExFunc()中被捕捉,所以它导致了throwExFunc()的执行结束(否则会输出:exit throwExFunc())。在main()函数中,catch(ExClass e)捕获了异常对象,通过复制构造函数产生对象e,e的num值为200,catch语句块运行完结束后,对象e首先被销毁,紧接着销毁异常对象。在这之后,程序继续运行,输出:continue to execute。

(2)catch(…)的意思是可以捕获所有类型的异常。不提倡随意地使用catch(…),因为这会导致异常类型的不精确处理,并降低程序的运行效率。但是,在程序的开发阶段,catch(…)还是有用的,因为如果在精心安排异常捕获之后,还是进入了catch(…)语句块,说明前面的代码存在缺陷,需要进一步改正。

(3)在捕捉异常对象时,还可以采用传引用的方式,例如把catch语句写成catch(ExClass& e),这样就可以不必产生异常对象的副本,减少程序的运行开销,提高运行效率。

(4)在抛出异常时,还可以抛出一个指针。当然这种做法并不总是安全的。如果要确保安全,应该将指针指向全局(静态)对象的指针或指向动态申请的空间,或者被抛出的指针在本函数内被捕获。否则,利用一个被抛出的指向已经被销毁的对象指针很危险。如果实在要用,首先,必须保证对象的析构函数不能对对象的内容作损伤性的修改,其次,对象的空间没有被其他新产生的变量覆盖。也就说,尽管对象被释放,但它的有效内容依然保留在栈中。

以上就是C++抛出和接收异常的顺序的详细内容,更多关于C++抛出和接收异常的资料请关注其它相关文章!


推荐阅读
  • 当iOS设备越狱后,某些插件可能会导致系统崩溃(白苹果)。此时,可以通过进入安全模式来排查并删除有问题的插件。本文将详细介绍如何通过特定按键组合进入不加载MobileSubstrate的安全模式,并提供相关背景知识。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 在 Windows 10 中,F1 至 F12 键默认设置为快捷功能键。本文将介绍几种有效方法来禁用这些快捷键,并恢复其标准功能键的作用。请注意,部分笔记本电脑的快捷键可能无法完全关闭。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 如何在PHPcms网站中添加广告
    本文详细介绍了在PHPcms网站后台添加广告的方法,涵盖多种常见的广告形式,如百度广告和Google广告,并提供了相关设置的步骤。同时,文章还探讨了优化网站流量的SEO策略。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
author-avatar
你不必害怕q因为我会发光
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有