“异常处理”学习小结

2023-05-16

        在我经历过的项目中,很少使用异常处理;对于问题的调试与追踪,基本上都是基于错误码和日志信息。
        这里的学习总结来自于<<C++编程思想 第2卷>>和网络,有很多问题的理解还需要实践经验。

在C语言中处理异常的3种方式:
        1) 在函数中返回错误信息;
        2) 使用标准C库中的信号处理系统,由函数signal()和raise()实现;
        3) 使用标准C库中的非局部跳转函数:setjmp()和longjmp()。

如果在C++中使用C的错误处理方式将会遇到的问题:
        信号处理方法signal()/raise()和函数setjmp()/longjmp()并不调用析构函数,所以对象不会被正确清理。
(顺便说下goto: 使用goto跳入某个作用域,或者使用longjmp()跳出某个作用域,然而这个作用域的栈中有某个对象需要析构时,程序的行为是不确定的)

C++中异常处理流程:
        1.设置一个try块;
        2.在try块中用关键字throw抛出异常;
        3.紧跟try块用异常处理器catch处理异常。

C++异常处理最大的用处:当异常抛出时,程序将做恰当的清理工作。

新名词解释:
        栈反解(stack unwinding):异常发生之前创建的局部对象自动被销毁。
        RAII(Resource Acquisition Is Initialization, 资源获得式初始化):将资源分配成局部对象生命周期的一部分,如果某次分配失败了,那么在栈反解得时候,其他已经获得所需资源的对象能够被恰当地清理。RAII 的优势在于将对象的生命期管理与其他资源(锁、文件、网络连接等等)的管理整合,然后通过“smart pointer”一并解决,这是 C++ 独一无二的优势。
        异常规格说明(exception specification):C++提供一种语法告诉使用者函数会抛出的异常,这样使用者就能正确处理这些异常。当编写可能抛出异常的函数时,最好考虑使用异常规格说明;它提醒使用者来编写异常处理代码以及处理什么异常。异常规格说明主要是为非模板类准备的。

注意事项:
        对象或者是指向派生类对象的引用都会与其基类处理器匹配。(如果异常处理器针对对象而不是针对引用的,这个异常对象将会被“切割”,被截取成基类对象)
        如果没有任何一个层次的异常处理器能够捕获某种异常,一个特殊的库函数terminate()会被自动调用。默认情况下,teminate()调用标准C库函数abort()使程序执行异常终止而退出。通过使用标准的set_terminate()函数,可以设置自己的terminate()函数。
        在构造函数中抛出异常;不要在析构函数内部触发异常。
        析构函数不能抛异常原因:
        1.如果析构函数抛出异常,则异常点之后的程序不会执行,如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏的问题。
        2.通常异常发生时,c++的机制会调用已经构造对象的析构函数来释放资源,此时若析构函数本身也抛出异常,则前一个异常尚未处理,又有新的异常,会造成程序崩溃的问题。

异常安全(exception safety):
        异常安全代码能够使对象保持状态的一致性而且能够避免资源泄露。
        其他支持异常的语言几乎都有垃圾回收器(garbage collection),抛异常就抛了,不用担心析构,有垃圾回收器管着。只有 C++ 才有异常安全需要考虑,其他支持异常的语言都没有这一概念。
        异常安全是申请资源要在异常下正确释放;这不仅仅是内存,还包括文件、网络 等资源。 

避免使用异常情况:
        1.不在异步事件中使用异常;异常依赖于程序运行栈上的动态函数调用链,异步事件由完全独立的代码来处理,这些代码不是正常程序流程的一部分。
        2.不要在处理简单错误的时候使用异常;
        3.不要将异常用于程序流程的控制;
        4.不要强迫自己使用异常;
        5.新异常,老代码。


使用异常情况:

        1.简化,如果建立的错误处理模式使事情变得复杂并且难以使用,异常可以使错误处理更加简单有效;
        2.使建立的库和程序更安全;
        3.在构造函数中使用异常处理(构造函数没有返回值,但是构造函数中异常处理后,在析构时麻烦重重);
        4.让dynamic_cast<Derived&>(baseReference) 能报错,因为没有空引用;
        5.让操作符重载(overloaded operator)能报错,operator的返回类型往往无法包含错误码,例如operator=()返回的是 Type&;
C++也是唯一一个变量赋值有可能会抛异常的语言,例如 Person s; s = getPersonById(someId);,那么即便 getPersonById() 不抛异常也不能保证上一句赋值不抛异常。)

异常处理开销:

        当异常被抛出时,将造成运行时开销;原因是:一个throw表达式就像一个特殊的系统函数调用,它接收异常对象作为参数并且沿着执行调用链向上回溯;为了完成这项工作,编译器需要在栈上放置额外信息来辅助栈反解过程。


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

“异常处理”学习小结 的相关文章

  • python3-端口扫描(TCP connect扫描,SYN扫描,FIN扫描)

    利用python3进行端口扫描 xff0c TCP的方式有connect扫描 xff0c SYN扫描 xff0c FIN扫描 xff0c NULL扫描 xff0c ACK扫描 xff0c Xmas xff0c windows扫描 本次展示前
  • CSDN 编写数学公式参考文档

    CSDN markdown 编辑器使用的是 katex 来完成对 TeX 公式的解析 公式得紧挨两个 符内部 xff0c 而且第一个 后面不能有空格 xff0c 第二个 前面不能有空格 想要换行居中的话 xff0c 得使用两次 来将公式框起
  • 1、AI系统简介及AI系统的分类

    AI系统简介 AI这个缩写在越来越多的出现在公众面前 但是AI到底是什么就和AI这个词一样 大部分都能举一些例子 但是都却很难说清楚AI到底是什么 AI是Artificial Intelligence的简称 中文叫做人工智能 但是要找到一个
  • 六关节机器人工具坐标系位姿计算函数

    span class token keyword void span span class token function clacToolPose span span class token punctuation span RcEuler
  • ORB-SLAM2项目数据集运行(一)

    作为一名学习一年的机器视觉的学生 xff0c 一直以来都没有写过像样点的自己的东西 xff0c 真的是不像话 xff0c 虽然有时候觉得会占用一些时间 xff0c 但是能很大程度上帮助自己理解 从github上可以下载到源码 xff1a h
  • string是否以‘\0’结尾

    今天刷题 xff0c 刷着刷着发现了一个问题 xff0c 我好想对string这个了解不是很深 xff0c 我之前是把它跟C语言中的char类型总是分不清 xff0c 所以今天题也不刷了 xff0c 试着了解它们俩到底有什么区别 在C语言中
  • Matlab中函数fopen、fread、fseek和fwrite的用法

    1 fopen 打开文件或获取关于打开文件的信息 xff0c 下面以使用最多的情况为例 xff1a fileID 61 fopen filename permission xff1a 打开文件 xff0c 成功时 xff0c 返回一个大于或
  • PCB设计-四层板变两层板

    四层板变成两层板原本思路是 xff1a 从原理图导出一份asc文件 xff0c 将原先四层板的PCB封装全部保存到一个库里面去 xff0c 然后在PADS里导入asc文件 xff0c 然后将原先的结构定位从原来的PCB板上复制过来 xff0
  • Pycharm导入Django项目

    Pycharm导入Django项目 添加项目 xff1a file gt open 找到项目所在的位置打开项目 添加django后台项目路径 file gt settings gt Languages amp Frameworks 找到Dj
  • Windows安装多个python解释器

    Windows安装多个python解释器 注 xff1a 此方法仅仅是针对安装多个需要配置环境变量的解释器 xff0c 意思是可以在cmd中可以使用并完美切换的 xff1b 针对一个环境变量的解释器无效 xff0c 只有一个环境变量的主解释
  • Go语言开发环境搭建

    一 Windows下安装 安装Go开发包 官网下载Go语言开发包 xff0c 安装方法就是next xff0c 除了安装位置选择 安装目录选定一个好记的 尽量不要放在C盘中 xff0c 除非你盘空间很大 xff0c 完全够用 此路径需要自己
  • Django Rest Framework的使用整理

    Django Rest Framework 一 Rest Framework的基本介绍 程序的客户端有很多 xff1a 硬件设备 xff0c 游戏 xff0c APP xff0c 软件 xff0c 其他的外部服务端 1 Web应用模式 在开
  • Linux部署Python项目

    项目部署 项目部署的操作通常是由运维人员来进行统一管理装配的 xff0c 但是对于一个开发人员来讲 xff0c 基础的项目部署还是要会的 这里我主要讲解python的项目是如何部署的 xff0c 至于项目哪里来的 xff0c 这就要看观众如
  • 2、机器学习简介及其分类

    简介 机器学习是指让机器从数据中自动学习规律和知识 并利用这些规律和知识进行预测或决策的技术 机器学习包括监督学习 无监督学习 强化学习 其中监督学习也被称作有监督的学习 有监督的意思就是预先知道据有什么样的目标 通过一些已经知道结果的数据
  • VScode启动Vue项目

    VScode启动Vue项目 1 使用VScode打开文件夹 2 找到运行按钮 3 判断有没有默认的配置文件存在 4 若文件夹存在就检查配置文件是否存在 xff08 1 xff09 打开launch json xff0c 把如下代码粘贴到里面
  • Gunicorn+django部署

    部署前提是服务器中要有项目中所需的其他服务 xff0c 例 xff1a mysql数据库 xff0c nginx xff0c python解释器等 xff0c 在其他环境搭好的情况下使用此方式可简单部署一个django项目 至于安装上面提到
  • Protobuf生成文件报错

    Mac下protobuf生成文件报错问题解决办法 xff0c windows下就不会这么麻烦了 xff0c 如果linux下出现类似报错信息按照下面的解决逻辑依然适用 1 由 go out引发的报错 1 报错信息 xff1a user 64
  • Git操作的基本命令

    git命令常用步骤 初始化 xff0c 把当前文件夹作为git本地仓库 git init 把本地仓库与选程仓库关联 git remote add origin http gitee com 把项目区中做了修改的文件添加到暂存区 git ad
  • grpc的使用

    需要保证电脑中安装了 xff1a protobuf安装教程如果出现报错请看博客 xff1a protobuf报错问题解决基本使用demo地址 xff1a demo安全传输 流式传输的demo地址 xff1a demo2 简介 xff1a r
  • Matlab找不到新添加在路径里的.m文件

    我是把文件放在matlab toolbox路径下了 xff0c 需要更新一下toolboxcache就可以了 使用命令的方式 xff1a rehash toolboxcache

随机推荐

  • C中字符串查找

    目录 1 查找单个字符 strchr strrchr 2 查找多个字符中任一字符 strpbrk 3 查找一个子串 strstr 4 逐个检查两个字符串 strspc strcspn 字符串查找分为 xff1a 在字符串中查找单个字符 xf
  • 神经网络中的epoch、batch、batch_size、iteration的理解

    神经网络中的epoch batch batch size iteration的理解 下面说说这三个区别 xff1a xff08 1 xff09 batchsize xff1a 批大小 在深度学习中 xff0c 一般采用SGD训练 xff0c
  • PyTorch源码解读(四)torchvision.models

    PyTorch框架中有一个非常重要且好用的包 xff1a torchvision xff0c 该包主要由3个子包组成 xff0c 分别是 xff1a torchvision datasets torchvision models torch
  • 3、AI的道德风险测试

    AI的道德性 AI系统的道德性如何保障是一个重要而复杂的问题 涉及到人工智能的发展 应用 监管 伦理 法律等多个方面 保障AI系统的道德性是一个很重要的问题 因为AI系统不仅会影响人类的生活和工作 也会涉及人类的价值观和伦理道德原则 针对这
  • 舵机单独供电时与单片机共地接线图

    转载 xff0c 原文链接为 xff1a https blog csdn net LUqingyaun article details 88600573 简单说 xff1a 外部电源两根线 xff0c VCC接舵机 xff0c GND接单片
  • 【正点原子】STM32开发板实验教程(F103)第52讲 I2C通信实验

    IIC通信 I2C xff08 IIC xff0c Inter Integrated Circuit xff09 xff0c 两线式串行总线 xff0c 由PHILIPS公司开发用于连接微控制器及外围设备 它是由数据线SDA和时钟线SCL构
  • 【解决方案】WSL2下rviz启动不了(Segmentation fault)

    好久没用WSL2了 xff0c 前几天使用了下 xff0c 发现rviz一直启动不了 出现以下问题 到处搜寻解决方案 xff0c 最后终于解决啦 xff01 xff01 参考文章 具体解决方案 首先启动rviz xff0c 出现上述问题 r
  • 【ROS】—— ROS通信机制——服务通信(三)

    文章目录 前言1 服务通信理论模型2 服务通信自定义srv2 1 定义srv文件2 2 编辑配置文件2 3 编译 3 服务通信自定义srv调用 C 43 43 3 1 vscode配置3 2 服务端3 3 客户端3 4 配置 CMakeLi
  • 【ROS】—— ROS常用组件_TF坐标变换_多态坐标变换与TF坐标变换实操(十一)

    文章目录 前言1 多态坐标变换1 1 发布方1 2 订阅方 C 43 43 1 3 订阅方 python 2 坐标系关系查看3 TF坐标变换实操 C 43 43 3 1准备3 2 生成新的乌龟3 3 增加键盘控制3 4 发布方 发布两只乌龟
  • 自动驾驶自主避障概况

    文章目录 前言1 自主避障在自动驾驶系统架构中的位置2 自主避障算法分类2 1 人工势场法 xff08 APF xff09 2 1 1引力势场的构建2 1 2斥力势场的构建2 1 3人工势场法的改进 2 2 TEB xff08 Timed
  • LQR算法基本原理

    LQR算法基本原理 前言 陈苏的最优控制 https www wendangwang com doc 1b3fea9be6dd6e50a295238b 3 文章是对陈苏的最优控制PPT的原理部分进行的简单总结 xff0c 若文中存在错误 x
  • <FreeRTOS入门第四节>其他相关API介绍

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 API介绍 xff1f 二 API具体介绍1 UBaseType t uxTaskPriorityGet const T
  • <FreeRTOS入门第九节>事件标志位

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 事件标志位是什么 xff1f 二 API介绍1 事件标志位的创建2 事件标志位的设置3 事件标志位清除4 获取某一位的事
  • 2019小结

    2019已经过去 xff0c 回想这过去的一年 xff0c 是近几年来最忙碌的一年 年初 xff0c 参加了一场读书会 xff0c 和公司同事一起读书 一本优秀的书是作者思想的精华 xff0c 通过读书可以认识和了解自己思维以外的世界 虽然
  • 4 AI系统的道德风险之歧视和不平等性的验证方法

    在人类社会中歧视和不平等是非常严重的问题 歧视和不平等会侵犯人的尊严和权利 阻碍社会的发展与和谐 根据联合国的相关资料描述 歧视和不平等的形势很多 包含种族歧视 性别歧视 地域歧视 宗教歧视 残疾歧视等等 打击歧视和不平等是全人类的共同责任
  • 继续前行

    很久没有更新日志了 xff0c 很久没有写博客了 xff1b 我知道我有的时候很忙 xff0c 我知道当前还有更重要的事情 xff0c 我知道事情是做不完的 但不管怎么样 xff0c 我该停下脚步想一想 xff0c 怎么去走好下一步 202
  • 《即兴演讲》读书笔记

    这是一本我一直在寻找的书 xff1b 因为我从事技术工作 xff0c 十多年来每天都和计算机打交道 xff0c 很少有机会站在台上讲话 xff1b 我对演讲是敬畏的 xff0c 想上台表现自己但心里又充满了恐惧 xff1b 偶尔的上台机会只
  • 读“赵4老师”言论

    在查看CSDN论坛时 xff0c 发现 赵4老师 无处不在 xff0c 赵4老师 通常不会直接给出答案 xff0c 而是直接复制言论 赵4老师的语言虽然很 犀利 xff0c 但仔细想想 xff0c 有些还是有道理的 xff0c 至少帮助我从
  • *.map文件

    关于linux程序的map文件 xff0c 网络上资料很少 xff0c 大概看了下map文件 xff0c 虽然理解的不是很透彻 xff0c 但是还是对程序的编译 运行 内存分配有了一点新的认识 1 map文件是程序的全局符号 源文件和代码行
  • “异常处理”学习小结

    在我经历过的项目中 xff0c 很少使用异常处理 xff1b 对于问题的调试与追踪 xff0c 基本上都是基于错误码和日志信息 这里的学习总结来自于 lt lt C 43 43 编程思想 第2卷 gt gt 和网络 xff0c 有很多问题的