C++11——异常

news2024/11/29 20:35:40

异常的介绍

异常是C++1中的一种处理错误的方式,当某一函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误,异常的使用可以避免一些难以发现的bug被更好的发现并被处理。

异常的使用

异常的使用包含是三个部分,分别是:throw、try{}、catch(){}

  •  throw:当程序问题出现时,通过使用 throw 关键字来抛出一个异常。
  • try{}:try {}中放置可能抛出异常的代码,try 块中的代码被称为保护代码。某一块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。
  • catch(){}:catch在try之后使用,()中放的是throw抛出的异常类型,catch 关键字用于捕获throw关键字抛出的异常,可以有多个catch进行捕获,应对不同的情况。
int Div(int m, int n)
{
	if (n == 0)
	{
		throw string("除数不能为0");
	}
	return m / n;
}
void test()
{
	try
	{
		int m, n;
		cin >> m >> n;
		cout << Div(m, n) << endl;
	}
	catch (string& err)//捕获抛出异常类型为string
	{
		cout << err << endl;
	}
	catch (int err)//捕获抛出异常类型为int
	{
	{
		cout << err << endl;
	}
	catch (...)//捕获没有匹配的任意类型的异常,防止没有捕获异常程序终止
	{
		cout << "未知异常" << endl;
	}
}

异常的注意事项

  1.  异常是通过throw抛出对象而引发的,所以激活哪个catch的处理代码是由throw抛出对象决定的
  2. catch异常处理代码是调用链中与throw抛出对象类型匹配且离抛出异常位置最近的那一个。
  3. 抛出的异常对象可以是任意的,被抛出的异常对象会生成一个异常对象的临时拷贝,用于传递给catch捕捉异常,临时对象会在被catch后销毁。
  4. catch(...)可以捕获任意类型的异常,是避免没有捕获到异常导致程序终止的一个保险措施。 

需要注意的是,try与catch使用的 {} 是不能被省略的,此外,throw抛出异常被catch捕获,是按异常对象相匹配的前提下,逐层寻找最近的一个catch进行异常处理的,然后沿着catch后的代码继续运行,如果直到main ()函数都没有寻找到合适的catch,查询将会直接终止

 throw的重新抛出

在某些情况下,当前catch捕获到throw抛出的异常对象并不能在当前进行完全处理,此时可以在catch中二次使用throw再次抛出相同的异常对象,交予更上一层的函数体进行处理。

int Div(int m, int n)
{
	if (n == 0)
	{
		throw string("除数不能为0");//抛出异常会直接跳到对应catch位置,找离得最近的cach,直到mian函数
	}
	return m / n;
}
void func()
{
	int* p = new int;
	int a;
	int b;
	try
	{
		cin >> a >> b;
		*p = Div(a, b);
	}
	catch (...)
	{
		delete[] p;
		throw;//delete后将异常抛出交予外层函数处理
	}
	delete[] p;
}

 

异常规范

对于异常的使用,实际还有着更加规范的用法,用于某一函数体后,可以起到提醒的作用,只不过在实践中因为很多人嫌麻烦,不会去使用这些异常的规范,但我们还是需要了解如何使用。

异常规格说明:throw()

  • throw()用于函数后方,( )  中放入可能抛出的异常类型,可以是一个或多个。
  • ()中如果没有放任何类型参数,则表示该函数不会抛出异常。
  • noexcept用于函数体后,表示该函数不会抛出异常,与throw ( ) 不带参数的效果一致。

异常安全

异常的抛出并不是在任意地方都可随意使用,对于类中的构造函数、析构函数这种可能涉及到类对象的初始化以及资源的销毁的函数中,最好不要去使用抛出异常

例如:对于在构造函数中使用抛出异常,就可能会导致类对象并没有完全初始化,这可能会导致问题进一步难以预测;在析构函数中使用抛出异常则有可能导致类对象的资源销毁失败,从而引起资源泄露的问题。

异常的一些优缺点:

异常的使用可以清楚准确的显示出错误的各种信息,帮助更好的确定程序bug的问题出在哪里,此外异常也有着有多第三方库可供我们使用。但异常的使用也会带来一些不利之处,一旦程序运行时出错时,抛异常就会乱跳,会导致程序的调试变得更加困难,此外异常也有着异常安全问题,使用不当可能会导致内存泄露等问题。但总而言之,异常是一个利大于弊的东西,是值的使用的一个工具。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从空口分析BLE AUDIO ASCS

ASCS&#xff1a;AUDIO STREAM CONTROL SERVICE&#xff0c;音频流控制服务&#xff0c;顾名思义会对音频流的一些参数去做控制的服务&#xff0c;下面我们还是以手机和耳机为例&#xff0c;结合空口来分析ASCS都有哪些内容&#xff1a; 1&#xff1a;ASE CODEC CONFIG 配置A…

保姆级教程下载finalshell以及连接云服务器基础的使用教程

废话不多说&#xff0c;我们直接进行安装 一、软件下载 下载地址&#xff1a; FinalShell SSH工具,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux,版本4.5.10,更新日期2024.9.26 - FinalShell官网 (hostbuf.com)https://www.hostbuf.com/t/988.html 点击链接进行下载…

【Next.js 项目实战系列】01-创建项目

原文链接 CSDN 的排版/样式可能有问题&#xff0c;去我的博客查看原文系列吧&#xff0c;觉得有用的话&#xff0c;给我的库点个star&#xff0c;关注一下吧 创建项目 创建项目​ 在创建项目中可以找到相关内容&#xff0c;这里不再赘述 First commit​ 创建好项目之后&am…

40个IT运维加薪技术,每一个都含金量极高!运维必会的10个网络抓包/调试工具!系统崩溃的10种可能,运维人员必看!

40个IT运维加薪技术&#xff0c;每一个都含金量极高!运维必会的10个网络抓包/调试工具&#xff01;系统崩溃的10种可能&#xff0c;运维人员必看&#xff01; 在IT运维领域&#xff0c;想要加薪并不仅仅依赖于单一的技术&#xff0c;而是需要综合运用多种技能&#xff0c;不断提…

【LangChain】(一)掌握向量数据库的CRUD操作与语义检索技巧

文章目录 1. 向量数据库的基础知识1.1 为什么选择向量数据库&#xff1f; 2. CRUD操作详解2.1 向量数据库-新增数据示例代码&#xff1a; 2.2 向量数据库-删除数据示例代码&#xff1a; 2.3 向量数据库-更新数据2.4 向量数据库-查询数据2.4.1 相似度查询2.4.2 最大边际相关性查…

React(二) JSX中的this绑定问题;事件对象参数传递;条件渲染;列表渲染;JSX本质;购物车案例

文章目录 一、jsx事件绑定1. 回顾this的绑定方式2. jsx中的this绑定问题(1) 方式一&#xff1a;bind绑定(2) 方式二&#xff1a;使用 ES6 class fields 语法(3) 方式三&#xff1a;直接传入一个箭头函数(重要) 3.事件参数传递(1) 传递事件对象event(2) 传递其他参数 4. 事件绑定…

DeepBook V3和DEEP token正式上线

10月14日&#xff0c;DeepBook V3版本正式在主网上线&#xff0c;同时发布了DEEP token&#xff0c;标志着其发展历程中的一个重要里程碑。通过这次升级&#xff0c;用户和做市商将受益于精细调控的激励措施&#xff0c;为通过社区驱动的治理实现更大的去中心化奠定了基础。 D…

【大模型问答测试】大模型问答测试脚本实现(第一版)

背景 公司已经做了一段时间的大模型&#xff0c;每次测试或者回归的时候都需要针对问答进行测试回归&#xff0c;耗费大量的时间与精力&#xff0c;因此结合产品特点&#xff0c;开发自动化脚本替代人工的操作&#xff0c;提升测试回归效率 设计 使用pythonrequestExcel进行…

python+大数据+基于Spark的共享单车数据存储系统【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

【jQuery】 jQuery基础及选择器介绍(基本选择器 层次选择器 属性选择器 过滤选择器)

文章目录 jQuery基础1. 优势2. 版本3. 基本语法4. 选择器基本选择器层次选择器属性选择器过滤选择器基本过滤选择器可见性过滤选择器 注意事项 jQuery基础 jQuery 是一个功能强大且易于使用的 JavaScript 库&#xff0c;它极大地简化了前端开发的工作。无论是 DOM 操作、事件处…

简单概述Ton链开发路径

区块链开发领域发展迅速&#xff0c;各种平台为开发人员提供不同的生态系统。其中一个更有趣且越来越相关的区块链是TON&#xff08;开放网络&#xff09;区块链。TON 区块链最初由 Telegram 构思&#xff0c;旨在提供快速、安全且可扩展的去中心化应用程序 (dApp)。凭借其独特…

加盟模式如何运营?有哪些好的技巧和方法!

对于很多品牌方来说&#xff0c;生意发展到一定程度&#xff0c;就考虑通过加盟的方式扩大市场份额。 本篇文章&#xff0c;将从3个角度来为大家分享&#xff0c;运营加盟模式的好方法和技巧&#xff01; 一、加盟前的准备 1、明确品牌定位与核心竞争力 确定你的企业在市场…

暖水毯/取暖毯语音识别控制芯片IC方案

暖水毯、取暖毯作为现代家居生活的温暖伴侣&#xff0c;其智能化升级已是大势所趋。在暖水毯与取暖毯中融入语音识别控制芯片IC方案&#xff0c;为用户的冬日取暖体验带来了革命性的变革。 一、暖水毯/取暖毯增加语音识别控制芯片方案&#xff0c;让产品能通过对话来调节&…

【笔记】vue课堂小作业之书籍购物车列表的增删改查小记

&#xff08;一&#xff09;reduce作迭代器 1. reduce 函数的基本用法 array.reduce((accumulator, currentValue) > { ... }, initialValue); accumulator: 累积器&#xff0c;表示当前累积的值&#xff0c;通常在第一次时为 initialValue。&#xff08;总数sum&#x…

OpenCV高级图形用户界面(8)在指定的窗口中显示一幅图像函数imshow()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在指定的窗口中显示一幅图像。 函数 imshow 在指定的窗口中显示一幅图像。如果窗口是以 cv::WINDOW_AUTOSIZE 标志创建的&#xff0c;图像将以原…

遵循国药准字,确保益安宁丸疗效与安全

益安宁丸真品辨别唯一标准 益安宁丸为同溢堂药业有限公司所独家生产的一款中成药&#xff0c;在内地市场和港澳地区均有上市。 益安宁丸真品的唯一标准&#xff1a;无论港版还是内地版&#xff0c;包装盒必然有国药准字Z20063087标识&#xff0c;但凡没有国药准字标识的必为假…

性价比最高的开放式耳机,五大热门品牌开放式耳机

在当今快节奏的生活环境中&#xff0c;开放式耳机以其独特的开放式设计&#xff0c;既能让用户享受高质量的音乐&#xff0c;又能保持对外界环境的感知&#xff0c;逐渐成为市场上的新宠。然而&#xff0c;面对众多品牌和型号&#xff0c;如何选择一款性价比高的开放式耳机成为…

IDEA 编译报错 “java: 常量字符串过长” 的解决办法

目录 一、问题描述二、问题原因2.1 理论角度2.2 源码角度 三、解决方案解决方案①&#xff1a;StringBuilder 拼接解决方案②&#xff1a;读取文件内容 四、方案验证 在线文本换行工具&#xff1a; https://lzltool.cn/Toolkit/WrapWordsInText 一、问题描述 今天在开发过程中…

JavaScript全面指南(五)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript全面指南 目录 81、ES6 class关键字原理跟function什么区别 82、如何检…

Vue(3) 组件

文章目录 对组件的理解单文件组件非单文件组件基本使用几个注意点组件的嵌套VueComponent构造函数一个重要的内置关系 组件的自定义事件全局事件总线安装全局事件总线使用事件总线解绑事件消息订阅与发布简介使用步骤范例 $nextTick插槽1.默认插槽2.具名插槽作用域插槽 对组件的…