C++第十五讲:异常

C++第十五讲:异常

  • 1.异常的概念和使用
    • 1.1异常的抛出和捕获
    • 1.2异常抛出和捕获的注意事项
    • 1.3异常的重新抛出
    • 1.4异常规范
  • 2.标准库的异常

1.异常的概念和使用

1.1异常的抛出和捕获

异常的抛出和捕获的过程分为三个阶段:
1.异常的抛出:
使用throw对异常进行抛出,异常抛出之后,该函数会直接中断运行,该函数内部的对象(new出的对象仍然需要自己delete释放)会调用对应的析构函数或被系统回收,抛出的对象可能是一个局部对象,所以抛出的是对象的拷贝,该拷贝会在catch子句后销毁
2.栈展开:
异常抛出之后,开始进行栈展开过程,该过程其实就是逐层向上,检查每个函数是否有对应的catch进行捕获,这个过程中,如果一个函数中没有对应的catch进行捕获,那么该函数就会被销毁,对应的局部变量会被回收(如果没有被new出来就被跳过,肯定不需要也不允许回收),然后继续向上查找对应的catch,如果没有找到,那么就会发生报错(异常抛出之后,是必须要进行catch的)
3.异常的捕获:
使用catch对异常进行捕获,一旦捕获成功,栈展开立刻停止,我们可以通过访问异常对象对错误信息进行处理,catch后面的代码正常执行

1.2异常抛出和捕获的注意事项

1.异常会被捕获在调用链中与该对象类型匹配而且离抛出位置最近的那一个
2.重点:派生类抛出的异常,可以由基类进行捕获
3.重点:new对象必须要手动delete进行资源释放
4.catch的匹配允许权限的缩小匹配:从非常量到const常量的转换,从数组向数组指针类型的转换(一般不会抛出数组),从函数向函数指针的转换,从派生类向基类的转换(这个是重点)
5.重点:如果到main函数,异常还是没有匹配,为了防止程序非严重错误终止,通常会使用catch(…)对所有异常进行捕获

2.重点:派生类抛出的异常,可以由基类进行捕获

在这里插入图片描述

3.重点:new对象必须要手动delete进行资源释放

在这里插入图片描述

5.重点:如果到main函数,异常还是没有匹配,为了防止程序非严重错误终止,通常会使用catch(…)对所有异常进行捕获

在这里插入图片描述

1.3异常的重新抛出

有时catch到异常之后,要对异常进行分类,有的异常需要进行特殊的处理,就可以使用throw对异常进行重新抛出:

在这里插入图片描述

当我们使用微信时,可能会遇到信息发送不出去的问题,该问题可能是因为没有对方的好友,可能是网络信号不好,如果是网络不好,我们可以通过throw对信息进行重复发送(比如微信的转圈圈,其实就是消息没有发送出去,进行重复发送),重复发送三次,如果还是发送不出去的话,那么再报异常:

在这里插入图片描述

1.4异常规范

对于我们而言,提前知道程序是否会抛出异常很好用
1.C++98标准,函数后面加上throw(),表示可能不抛异常,后面加throw(类型1,类型2……)表示可能抛多种异常(没有强制要求使用,所以一般不使用,了解即可)
2.C++11进行了简化,函数后加noexcept表示不会发生异常,啥也不加表示可能会有异常,如果加上了noexcept,但是函数内有异常处理机制,会造成未定义行为(包括但不限于程序崩溃、数据损坏、不正确的结果输出,或者程序继续执行但表现出不可预测的行为),但是编译会编译成功
3.我们可以使用noexcept(expression)检测一个表达式是否会抛出异常,不可能抛出异常,返回true,否则,返回false

在这里插入图片描述

// C++98
// 这⾥表⽰这个函数只会抛出bad_alloc的异常
void* operator new (std::size_t size) throw (std::bad_alloc);
// 这⾥表⽰这个函数不会抛出异常
void* operator delete (std::size_t size, void* ptr) throw();
// C++11
size_type size() const noexcept;
iterator begin() noexcept;
const_iterator begin() const noexcept;

2.标准库的异常

C++标准库中也有自己的一套异常继承体系库,基类是exception,使用时在主函数直接捕获exception即可,我们也可以对派生类what进行重写

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/4131.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML<bdo>标签

例子 指定文本方向&#xff1a; <bdo dir"rtl"> This text will go right-to-left. </bdo> <!DOCTYPE html> <html> <body> <h1>The bdo element</h1> <p>This paragraph will go left-to-right.</p> …

Git:问题解决办法 及 Tips 总结

目录 查看历史记录及比较区别查看所有提交的历史记录查看提交的详细历史记录查看提交之间的差异点击文件操作历史&#xff0c;筛选出所有改动过此文件的提交任意两个提交之间的比较&#xff08;开发及查BUG常用&#xff09; 在需要版本回滚的情况下处理方法短时间内无法彻查BUG…

uniApp开通uniPush1.0个推,SpringBoot集成uniPush1.0个推

uniApp开通unipush1.0个推&#xff0c;SpringBoot程序集成 一、APP开通unipush1.0个推(商户App源码仅支持1.0个推) 1.app模块配置开通推送 2.应用开通推送 3.开通后点击消息推送菜单会看到如下页面 完成以上步骤后 此时android 仅支持在线推送。 4.配置各厂商离线推送 暂未…

[JavaScript] 深入理解流程控制结构

文章目录 1. **if-else 语句**基本语法&#xff1a;示例&#xff1a;扩展&#xff1a;else if 2. **switch-case 语句**基本语法&#xff1a;示例&#xff1a;注意事项&#xff1a; 3. **for 循环**基本语法&#xff1a;示例&#xff1a;扩展&#xff1a;for-in 和 for-of 4. *…

庄小焱——2024年博文总结与展望

摘要 大家好&#xff0c;我是庄小焱。岁末回首&#xff0c;2024 年是我在个人成长、博客创作以及生活平衡方面收获颇丰的一年。这一年的经历如同璀璨星辰&#xff0c;照亮了我前行的道路&#xff0c;也为未来的发展奠定了坚实基础。 1. 个人成长与突破 在 2024 年&#xff0c…

八大排序--冒泡排序

目录 什么是冒泡排序&#xff1f; 算法步骤 举例说明 代码实现&#xff08;java&#xff09; 什么是冒泡排序&#xff1f; 冒泡排序&#xff08;英语&#xff1a;Bubble sort&#xff09;是一种简单的排序算法。由于在算法的执行过程中&#xff0c;较小的元…

新阿里云买服务器配置需手动配置80端口

新买阿里云服务器需手动配置80&#xff0c;端口才可以访问nginx CentOS系统 安装nginx 1. 安装 Nginx yum install nginx 2. 启动 Nginx 服务 systemctl start nginx 3. 修改默认网页 cd /usr/share/nginx/ echo "666" >index.html cat index.html 访问ngin最后…

如何下载对应城市的地理json文件

这里采用的是阿里地图工具进行查找&#xff1a; DataV.GeoAtlas地理小工具系列 由阿里云DataV数据可视化团队出品,多年深耕数据可视化领域,数据大屏业务开拓者和领航者。致力用震撼而清晰的视觉语言,让更多人读懂大数据,受惠数据驱动的决策方式 第一步打开网站 &#xff1a; …

“libcudart,so.1 1.0“ loss解决方案

sudo find /usr/ -name libcudart.so.11.0 2 > /dev/null参考链接&#xff1a;1、https://stackoverflow.com/questions/70967651/could-not-load-dynamic-library-libcudart-so-11-0 2、https://blog.csdn.net/weixin_43786241/article/details/109203995

通过图形界面展现基于本地知识库构建RAG应用

1. 客户需求 快速完成概念验证(PoC)通过图形界面快速完成演示本地私有数据对比不同模型和成本&#xff0c;决定如何部署 2. 阿里云基于本地知识库构建RAG应用 参考方案&#xff1a; 百炼本地知识库方案 解决方案&#xff1a; FastAPI Gradio Llamaindex qwen-plus 主要三大…

安路FPGA开发工具TD:问题解决办法 及 Tips 总结

安路科技&#xff08;Anlogic&#xff09;是一家专注于高性能、低功耗可编程逻辑器件&#xff08;FPGA&#xff09;设计和生产的公司。其提供的开发工具TD&#xff08;TangDynasty&#xff09;是专门为安路FPGA系列产品设计的集成开发环境&#xff08;IDE&#xff09;。以下是对…

聚铭网络6款产品入选CCIA《网络安全专用产品指南》

近日&#xff0c;中国网络安全产业联盟CCIA正式发布《网络安全专用产品指南》&#xff08;第二版&#xff09;&#xff08;以下简称《指南》&#xff09;。聚铭网络凭借突出技术优势、创新能力以及市场积累&#xff0c;旗下安全产品成功入选防火墙、网络安全审计、日志分析、网…

渗透笔记1

第一天 工具&#xff1a;cs cobalt strike 4.9 / msf kali &#xff08;自带 Ubuntu&#xff09; cs cobalt strike 4.9&#xff1a;server-client server部署在云服务器上&#xff0c;client分别在各地&#xff0c;与server相连接&#xff1b;连接上后就可以共享上线主机。…

计算机网络 (51)鉴别

前言 计算机网络鉴别是信息安全领域中的一项关键技术&#xff0c;主要用于验证用户或信息的真实性&#xff0c;以及确保信息的完整性和来源的可靠性。 一、目的与重要性 鉴别的目的是验明用户或信息的正身&#xff0c;对实体声称的身份进行唯一识别&#xff0c;以便验证其访问请…

《Vue3 九》动画

Vue 提供了一些内置组件和对应的 API 来完成动画&#xff0c;利用它们可以方便地实现动画效果。 <transition> 内置组件&#xff1a; Vue 提供了 <transition> 内置组件&#xff0c;可以给任意元素或组件添加进入/离开时的动画效果。在条件渲染、动态组件、改变 …

人工智能之数学基础:线性代数中的线性相关和线性无关

本文重点 在线性代数的广阔领域中,线性相关与线性无关是两个核心概念,它们对于理解向量空间、矩阵运算、线性方程组以及人工智能等问题具有至关重要的作用。 定义与直观理解 当存在一组不全为0的数x1,x2,...,xn使得上式成立的时候,那么此时我们可以说向量组a1,a2...,an…

【王树森搜素引擎技术】相关性03:文本匹配(TF-IDF、BM25、词距)

链路上的相关性模型 召回海选 打分量&#xff1a;数万模型&#xff1a;文本匹配分数线性模型或双塔BERT模型 粗排 打分量&#xff1a;数千模型&#xff1a;双塔BERT&#xff0c;或单塔BERT模型&#xff08;交叉&#xff09; 精排 打分量&#xff1a;数百模型&#xff1a;单塔B…

owasp SQL 注入-03 (原理)

1: 先看一下注入界面: 点submit 后&#xff0c;可以看到有语法报错&#xff0c;说明已经起作用了: 报如下的错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near at line 1 2:…

项目实战--网页五子棋(游戏大厅)(3)

我们的游戏大厅界面主要需要包含两个功能&#xff0c;一是显示用户信息&#xff0c;二是匹配游戏按钮 1. 页面实现 hall.html <!DOCTYPE html> <html lang"ch"> <head><meta charset"UTF-8"><meta name"viewport"…

【Idea】编译Spring源码 read timeout 问题

Idea现在是大家工作中用的比较多的开发工具&#xff0c;尤其是做java开发的&#xff0c;那么做java开发&#xff0c;了解spring框架源码是提高自己技能水平的一个方式&#xff0c;所以会从spring 官网下载源码&#xff0c;导入到 Idea 工具并编译&#xff0c;但是发现build的时…