当前位置: 首页 > news >正文

C++ 异常处理机制讲解

文章目录

  • 异常处理
    • 除数为0
    • 内存分配异常
    • 异常传递过程
    • 处理自定义异常:

异常处理

除数为0

我们通过一个简单的例子来引入
例如:

int divide1(int v1, int v2) throw(int) {
	return v1 / v2;
}

我们有一个简单的除法函数,计算所得的结果是多少,我们可以传递两个参数,但是你有没有想过,如果我们传递被除数一个零会出现什么?

我们的程序会直接崩毁。但是我们无法得到提示,也就是说,我们无法知道我们是否写的没错。

我们可以在函数内部加一个throw的东西,指的是抛出一个引用,这个东西可以是任意类型:

int divide1(int v1, int v2) throw(int) {
	if (v2 == 0) {
		// 抛出异常
		throw 666;
	}
	return v1 / v2;
}

这样我们就定义了一个简单的异常处理函数,那么我们在主函数应该如何接受这个异常呢?

int main() {
	try{
		divide1(10, 0);
	}
	catch (int error){
		cout << "除数不能为0! " << error << endl;
	}
	getchar();
	return 0;
}

注意:因为我们的ethrow抛出了一个int值,所以我们想要捕获这异常,就要传递一个int,之后我们能够打印我们定义的信息:

执行顺序:

  1. 执行try块的函数,如果正常则什么都不会执行
  2. 如果函数抛出了一个异常,不管是什么类型的,只要你抛出了throw异常,那么catch就会接受这个throw的消息,打印catch中的信息
  3. 注意:函数中抛出了错误,则下面的代码将不会执行,会直接返回,例如,不会执行return,直接被catch接受了。

执行结果: 注意:throw的数值不重要,重要的是告诉catch,你要接收这个异常,你可以throw任意类型。const char* int double 等等等,打不打印此throw由你决定,重要的是捕获此异常。

在这里插入图片描述


内存分配异常

使用异常处理来处理我们的内存分配失败的情况:

for (int i = 0; i < 99999; i++) {
	try {
		int *p = new int[9999999];
	} catch (const exception &exception) {
		cout << "产生异常了:内存不够用 - " << exception.what() << endl;
		break;
	}
}

我们会直接catch抛出异常,此catch的内容指的是接受所有的任意类型,也可以使用三个点 …

异常传递过程

void func1() {
	cout << "func1-begin" << endl;

	throw 666;

	cout << "func1-end" << endl;
}

void func2() {
	cout << "func2-begin" << endl;

	func1();

	cout << "func2-end" << endl;
}

void test3() {
	cout << "test3-begin" << endl;

	try {
		func2();
	} catch (int exception) {
		cout << "产生异常了(int):" << exception << endl;
	}

	cout << "test3-end" << endl;
}
int main()
{
	cout<<"main-begin"<<endl;
	text3()
	cout<<"main-end"<<endl;
	return 0;
}

解析:我们通过main函数调用一个test3函数,test3函数又调用func2函数,func2函数又调用了func1,我们假定func1抛出了一个异常,则程序的执行情况会是怎样的??
注意:我们的try catch在test3函数中处理异常。

在这里插入图片描述
我们来分析一下:
main函数进入test3函数,进入func2函数,进入func1函数,然后抛出异常,注意,没有catch捕获的话,下面的语句将不会执行,则一直到test3捕获完毕后,才会打印end。

处理自定义异常:

标准库自带的标准错误:
在这里插入图片描述

我们定义的和标准库的其实是一样的:

// 所有异常的基类
class Exception {
public:
	virtual const char *what() const = 0;
	virtual int code() const = 0;
};

class DivideException : public Exception {
public:
	const char *what() const {
		return "不能除以0";
	}

	int code() const {
		return 202;
	}
};

class AddException : public Exception {
public:
	const char *what() const {
		return "加法有问题";
	}

	int code() const {
		return 201;
	}
};

我们通过一个纯虚函数作为错误的基类,不同的类继承自纯虚函数,然后重写其纯虚函数的方法,这样我们就能以不同的捕获来处理不同的错误。。

int divide1(int v1, int v2) throw(int) {
	if (v2 == 0) {
		// 抛出异常
		throw 666;
	}
	return v1 / v2;
}
int main()
{
	try{
		divide1(10, 0);
	}
	catch (const Exception& error){
		cout << error.code() << error.what() << endl;
	}
	return 0;
}

在这里插入图片描述

相关文章:

  • 【软考 - 高级系统架构设计师】考前冲刺计划 及 国庆作息时间
  • Typescript的数组类型
  • 【分治法】第k个数(快速选择算法,结合快速排序)
  • 西瓜书研读——第四章 决策树:ID3、C4.2、CSRT算法
  • aistudio 常规赛:钢铁缺陷检测挑战赛 经验总结,轻松复现map 47排名再度提升
  • 学习小发现-04-如何从字符串中提取数字并转换为整型输出、如何在%d输入内容中判断整型并只读取数字以整型输出、scanf的各种用法
  • Python中的闭包
  • Java知识【继承中的成员访问特点】
  • <Linux进程控制(2)>——《Linux》
  • 嵌入式软件编程模式
  • VL8 使用generate_for语句简化代码
  • 从零开始搭建uni-app框架的小程序开发环境
  • 【web】TCP/UDP协议详解(字节二面:TCP三次握手、四次挥手)
  • C++打怪升级(二)- 引用详解
  • MongoDB的日志目录被删除了,导致无法启动:(code=exited, status=1/FAILURE)
  • angular2 简述
  • CentOS 7 修改主机名
  • Hibernate【inverse和cascade属性】知识要点
  • Hibernate最全面试题
  • IOS评论框不贴底(ios12新bug)
  • iOS小技巧之UIImagePickerController实现头像选择
  • Java到底能干嘛?
  • node和express搭建代理服务器(源码)
  • PAT A1092
  • Redux 中间件分析
  • TypeScript迭代器
  • Vue小说阅读器(仿追书神器)
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何学习JavaEE,项目又该如何做?
  • 我感觉这是史上最牛的防sql注入方法类
  • 用jQuery怎么做到前后端分离
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​如何防止网络攻击?
  • #1015 : KMP算法
  • #每天一道面试题# 什么是MySQL的回表查询
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (二)Eureka服务搭建,服务注册,服务发现
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • .md即markdown文件的基本常用编写语法
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • :“Failed to access IIS metabase”解决方法
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [] 与 [[]], -gt 与 > 的比较
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [codeforces] 25E Test || hash
  • [C语言]——函数递归
  • [DEBUG] spring boot-如何处理链接中的空格等特殊字符
  • [EFI]Acer Aspire A515-54g电脑 Hackintosh 黑苹果efi引导文件
  • [EFI]英特尔 冥王峡谷 NUC8i7HVK 电脑 Hackintosh 黑苹果efi引导文件
  • [Flex][问题笔记]TextArea滚动条问题
  • [HackMyVM]靶场 VivifyTech