C++程序抛出异常后执行顺序

2023-05-16

1 析构函数中是否可以抛出异常
  首先我们看一个常见的问题,析构函数中是否可以抛出异常。答案是C++标准指明析构函数不能、也不应该抛出异常
  C++异常处理模型是为C++语言量身设计的,更进一步的说,它实际上也是为C++语言中面向对象而服务的。C++异常处理模型最大的特点和优势就是对C++中的面向对象提供了最强大的无缝支持。那么如果对象在运行期间出现了异常,C++异常处理模型有责任清除那些由于出现异常所导致的已经失效了的对象(也即对象超出了它原来的作用域),并释放对象原来所分配的资源, 这就是调用这些对象的析构函数来完成释放资源的任务,所以从这个意义上说,析构函数已经变成了异常处理的一部分。
  下面我们来看看析构函数中不能抛出异常的两个理由:
  1)如果析构函数抛出异常,则异常点之后的程序不会执行,如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏的问题。
  2)通常异常发生时,c++的机制会调用已经构造对象的析构函数来释放资源,此时若析构函数本身也抛出异常,则前一个异常尚未处理,又有新的异常,会造成程序崩溃的问题。
  那么当无法保证在析构函数中不发生异常时, 该怎么办?
  其实还是有很好办法来解决的。那就是把异常完全封装在析构函数内部,决不让异常抛出函数之外。这是一种非常简单,也非常有效的方法。

//析构函数
~Class()
{
  try{
  }
  catch(){  //这里可以什么都不做,只是保证catch块的程序抛出的异常不会被扔出析构函数之外。
   }
}

2 程序抛出异常后会怎样
  下面我们通过一个程序来观察当程序中抛出异常了是否会调用析构函数,异常抛出中throw()后面的语句是否还会执行。程序如下,我们创建一个类,然后构造一个类对象,当抛出异常我们看程序是否会进入析构函数以及throw()抛出异常后面的程序:

#include<iostream>
using namespace std;

class setTry{
public:
    setTry(){  //构造函数
        cout << "start!" << endl; // 1
    }
    ~setTry(){ //析构函数
        cout << "end!" << endl;   // 4
    }
    void dosomething(){
        cout << "do something!" << endl; //类方法
    }
};
int main(void)
{
    setTry newOne;
    try{
        throw("error!");  //直接抛出异常  
        newOne.dosomething();
    }
    catch (char* one){    //接收char*类异常  
        cout << one << endl;   // 2
    }
    catch (...){          //接收其他类型异常
        cout << "..." << endl;
    }
    cout << "return 0!"<<endl; // 3
    return 0;
}

  上面程序运行结就是按标注的1、2、3、4步骤输出的,结果如下图所示:

这里写图片描述

  从运行结果就可以看出,抛出异常try内部的throw()后面程序不会再执行,而try外部后面的程序会继续执行。另外,析构函数在生存期结束也会被调用。


  参考文献:
  http://blog.csdn.net/u012398613/article/details/17469581

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++程序抛出异常后执行顺序 的相关文章

  • STM32F103寄存器方式点亮LED流水灯

    一 设计思路 本实验使用GPIOB GPIOC GPIOD这3个端口控制LED灯 GPIO 是通用输入输出端口的简称 xff0c 简单来说就是 STM32 可控制的引脚 xff0c STM32 芯片 的 GPIO 引脚与外部设备连接起来 x
  • 一步步CEF(2)之编译ceflicent

    一步步CEF xff08 1 xff09 之编译libcef dll wrapper lib已经提供了c 43 43 的静态库 xff0c 这次要将cefclient编译出来 这里要说明一下 xff0c 如果仅仅将cefclient编译的话
  • Java查找最长字符匹配子串

    1 比较两个字符串 xff0c 短的那一个先判断是否包含在长的字符串中 2 如果不在 xff0c 短的字符串子串长度 1 xff0c 从前往后移判断是否包含 xff0c 不包含继续此操作 public class getMaxStringT
  • Python,Anaconda环境安装配置

    文章目录 Python安装pip包管理 Anaconda安装conda包管理和环境管理Python3与Python2共存 xff08 Anconda3与Anaconda2共存 xff09 Jupyter notebook配置Jupyter
  • SVN提示E230001、E170013解决方案

    解决办法 1 Windows电脑打开cmd命令行 xff0c Mac电脑打开终端 2 输入如下命令 svn ls https 127 0 0 1 8888 svn XXXXXXXX 这里是项目的svn地址 他会提示你输入信息 xff0c 这
  • 记一次Nginx启动失败解决过程(环境:linux Ubuntu 16.04 64bit , ECS for Aliyun)

    背景 今天装了个jpress想弄个博客 xff0c 然后关了Nginx和uwsgi xff0c 启动了tomcat 使用80端口 xff0c 后来直接shutdown sh关闭tomcat后 xff0c 再次启动Nginx报了个错误 Job
  • Windows安装Qt在选择界面卡死解决方案

    Windows安装Qt在选择界面卡死解决方案 很简单的操作 xff1a 就是安装了有道词典 xff0c 退出有道词典 xff0c 再安装Qt 哈哈哈 xff0c 是不是很简单 xff0c 我也是摸索了半天才知道 xff0c 网上说的各种卸载
  • Linux之cmake3.6安装

    1 官网下载cmake 3 6 3 tar gz https cmake org files v3 6 cmake 3 6 3 tar gz 2 解压文件tar xvf cmake 3 6 3 tar gz xff0c 并修改文件权限chm
  • mysql 分组获取最新一条记录

    1 需求 按用户名分组 xff0c 获取最新插入的一条记录 2 模拟数据 span class token comment span span class token comment Table structure for user spa
  • 电脑连接树莓派出现问题--(putty,VNC,MobaXterm和远程桌面连接)

    以下解决方法与问题是基于我之前给树莓派写的一个开机自启动python脚本导致的问题所提出的 如果你从来没有给树莓派写过脚本 xff0c 那我的这篇博客对现在的你来说没有帮助 xff0c 不用浪费时间了 今天在用PC的Putty ssh方式连
  • STM32+ESP-07S+MQTT服务器实现数据上传和接收

    参考文章 xff1a https blog csdn net weixin 46144773 article details 128793578 https docs ai thinker com esp8266 sdk esp32下载工具
  • Python问题:AttributeError: ‘str‘ object has no attribute ‘decode‘

    具体报错情况 xff1a AttributeError Traceback most recent call last lt ipython input 29 7b65833fd81b gt in lt module gt 8 from k
  • mount.nfs报错

    mount nfs requested NFS version or transport protocol is not supported 今天在挂载nfs时遇到mount nfs requested NFS version or tra
  • VMware虚拟机安装win10 32位

    VM15 43 Win10 32位 前期准备安装过程 前期准备 VMware Workstation15官方版下载 xff1a https www onlinedown net soft 2062 htm Win10 32位镜像下载 xff
  • AttributeError: ‘str‘ object has no attribute ‘value‘

    属性错误 xff1a str 对象没有属性 值 这是我在用python读取excel单元格的时候遇到的报错 xff0c cell对象没有属性值 xff0c 说明我的语法返回的是cell单元格对象而并非单元格的值 这时候只需将iter row
  • 算法题:马走日(C++)

    题目 xff1a 总时间限制 1000ms 内存限制 1024kB 描述 马在中国象棋以日字形规则移动 请编写一段程序 xff0c 给定n m大小的棋盘 xff0c 以及马的初始位置 x xff0c y xff0c 要求不能重复经过棋盘上的
  • WSL2-ubuntu1804安装以及一些个人使用调整

    文章目录 前言一 WSL是什么 xff1f 二 启用WSL21 首先确定自己的windows系统版本2 打开系统的虚拟化等一大堆功能3 切换默认模式至WSL2 三 安装WSL虚拟机 Ubuntu18041 下载安装 方法1 Microsof
  • LVM精简卷(Thinly-Provisioned Logical Volumes)的扩容

    LVM精简卷 Thinly Provisioned Logical Volumes 如果被人偷偷的在生产中使用 xff0c 紧急故障处理的时候 xff0c 可以一下子给人干懵 并且在百度还不能搜索到完整可用的文档 LVM精简卷的存在给我的感
  • Mac 备份 time machine开启全速备份

    Mac 备份非常慢 如果你的 Mac 是第一次在这个上面进行备份 xff0c 第一次备份一般都很慢 xff0c 可以调节参数的方式将其调节为全速进行备份 xff0c 记得备份完后将其调整回来 xff0c 否则可能会导致你的电脑在正常使用的时
  • 关于下载 http://arduino.esp8266.com/stable/package_esp8266com_index.json 出错的解决方法

    在使用 Arduino 43 NodeMCU 进行编程时 xff0c 有时候会出现如题所述的错误 xff0c 出错的网址是首选项中的 附加开发板管理器网址 xff0c 其意义是使得 Arduino 能够在开发板选项里找到ESP8266这块开

随机推荐

  • ubuntu 安装 qemu 提示 ERROR: glib-2.40 gthread-2.0 is required to compile QEMU and ERROR: pixman >= 0.21

    首先我们使用 xff1a apt cache search glib2 看看应该安装哪个库 sudo apt get install libglib2 0 dev 继续使用 apt cache search pixman 看看应该安装哪个库
  • 如何进行探索式数据分析?

    与数据同行 已开通综合 数据仓库 数据分析 产品经理 数据治理及机器学习六大专业群 xff0c 加微信号frank61822701 为好友后入群 新开招聘交流群 xff0c 请关注 与数据同行 公众号 xff0c 后台回复 招聘 后获得入群
  • Linux 移动或复制文件(文件夹)

    Linux 移动或复制文件 xff08 文件夹 xff09 命令格式 xff1a cp rf home backup default Public Public 复制 home backup default Public文件夹 到当前文件夹
  • 手把手教你配置阿里云服务器搭建网站

    写在前面 出于好奇 xff0c 我用学生优惠租了一台阿里云服务器 xff0c 打算做一些Java web的开发 xff0c 但是毕竟是第一次接触这样的东西 xff0c 还是比较懵逼 xff0c 在这个过程中遇到了一些问题 xff08 肯定会
  • Python

    人机交互 1 input 是输入函数 xff0c 会将所有输入做一个字符串类型的处理 a 61 input 作用 xff1a 显示出括号内的东西 xff0c 并要求用户输入一个东西 xff0c 赋给a 如果要有输入提示 xff0c 要在括号
  • PHP学习笔记——wampserver安装步骤

    1 wampserver的安装 安装链接 xff1a wampserver安装链接 选择 64 exe为后缀的安装包 xff08 前提是64位系统机器 xff09 选择语言 xff1a English 同意协议 next 选择安装路径 ne
  • 微博粉丝走势监控

    前言 因为之前写过很多爬虫 xff0c 然后近期也是选秀节目比较多 xff0c 像创造营 xff0c 青春有你等 一般情况下微博粉丝的增长速度是节目组比较关注的数据之一 因此 xff0c 想做一个简单的粉丝监控平台 xff0c 话不多说 x
  • ubuntu系统下各个目录的一般作用

    1 这是根目录 xff0c 一个Ubuntu系统下只有一个根目录 2 root 系统管理员的目录 3 boot 系统启动文件 4 bin 存放系统程序 5 etc 存放系统配置方面的文件 6 dev 存放与设备有观点文件 xff0c 例如
  • C/C++中枚举类型enum使用

    1 说明 xff1a 枚举enum的出现 xff0c 主要是为了解决一些特定属性的赋值 xff0c 变量取值仅在一定有限范围内的问题 例如一年只有十二个月取值 xff0c 一个星期只有七天情况 xff0c 人的性别只有男女两种等 这些属性如
  • Matlab中save实现保存数据到mat文件的正确使用

    主要需要注意save savePath A 和 save savePath 39 KSD 39 两种写法的区别 1 普通保存在当前文件夹下 save matPath mat span class hljs literal A span B
  • C/C++笔试必须熟悉掌握的头文件系列(三)——stdlib.h/cstdlib

    1 说明 stdlib h 头文件即标准库头文件 xff08 standard library xff09 xff0c stdlib 头文件里包含了C语言的最常用的系统函数 而C 43 43 中有对应相同作用的 cstdlib 头文件 xf
  • matlab图像类型转换以及uint8、double、im2double、im2uint8和mat2gray等说明

    1 matlab图像保存说明 matlab中读取图片后保存的数据是uint8类型 8位无符号整数 xff0c 即1个字节 xff0c 以此方式存储的图像称作8位图像 xff0c 好处相比较默认matlab数据类型双精度浮点double xf
  • PyCharm安装第三方库如Requests

    PyCharm安装第三方库是十分方便的 xff0c 无需pip或其他工具 xff0c 平台就自带了这个功能而且操作十分简便 如下 xff1a 注 xff1a 本人PyCharm已汉化 xff0c 若是英文版按括号中英文指示操作即可 1 打开
  • 关于django的ORM查询出来的数据格式的转换:OrderedDict类型转换为list;serializers序列化器配置字段可以为null

    目录 一 django查询的结果的类型是 xff1a OrderedDict类型 xff0c 如下 xff1a 二 serializers序列化器配置字段可以为null 一 django查询的结果的类型是 xff1a OrderedDict
  • pyCharm上解决安装不上pandas库问题

    最近在PyCharm上安装pandas库的时候 xff0c 总是安装不上 xff0c 提示好像是pip除了错误 我使用的是python 3 4版本 最后判断应该是自己pip版本应该太旧了 xff0c 最后再cmd更新了pip之后就行了 如下
  • 详细图解哈夫曼Huffman编码树

    1 引言 哈夫曼 xff08 Huffman xff09 编码算法是基于二叉树构建编码压缩结构的 xff0c 它是数据压缩中经典的一种算法 算法根据文本字符出现的频率 xff0c 重新对字符进行编码 因为为了缩短编码的长度 xff0c 我们
  • matlab生成随机数的rand、randi和randn三种形式

    matlab中关于随机数的产生有3种库函数 xff0c 下面我们来看看它们的形式 xff1a 1 rand 它是生成0 1之间 xff08 开环 xff0c 不包含0和1两个数 xff09 均匀分布的伪随机数 xff0c 也就是无穷次试验其
  • Linux解压tar.gz和tar.bz2的命令

    两者的命令主要是参数的不同 xff0c 解压tar gz和tar bz2不同压缩文件的命令如下 xff1a 1 解压tar gz文件 tar zxvf span class hljs preprocessor tar span span c
  • C/C++枚举enum分别打印输出枚举子和枚举值的方法

    关于枚举枚举的基础概念我这里不再介绍 xff0c 感兴趣的同学可以查阅另一篇博文C C 43 43 中枚举类型enum使用 这里我主要提一下在调试一个大型程序中遇到日志打印中一个关于枚举输出的小错误 我们知道枚举分为枚举子和枚举值 xff0
  • C++程序抛出异常后执行顺序

    1 析构函数中是否可以抛出异常 首先我们看一个常见的问题 xff0c 析构函数中是否可以抛出异常 答案是C 43 43 标准指明析构函数不能 也不应该抛出异常 xff01 C 43 43 异常处理模型是为C 43 43 语言量身设计的 xf