异常——浅析

news2024/12/28 19:10:33

异常

本人不才,对于异常只能做基本的介绍,无法给出自己的体会以及无法指明易错点

C异常

c语言处理异常的方式有
assert——直接中断程序
返回错误码——需要查找错误码表确定错误
这两种操作都不是很好,如果一个大型程序,为了找到一个错误,加载都需要半天,一遍又一遍的运行调试,是不是就很耗时间
于是c++就有了异常处理机制


C++异常

c++异常做到了程序自己检查异常,自己抛出异常,统一进行捕获,最重要的就是程序不会挂掉

通常有三部:
try——确定可能发异常的代码片段
throw——抛出异常
catch——捕获异常


double div()
{
	int a, b;
	cin >> a >> b;
	if (a == 0 && b == 0) throw(1);
	else if (b == 0) throw("div发生除0错误");
	else if (a == 3 && b == 3) throw(1.1);
	else if (a == 4 && b == 4) throw(1, 'c');

	return (double)a / b;
}
void test()
{
	while (1)
	{
		try
		{
			cout << div() << endl;
		}
		catch (const char* s)
		{
			puts(s);
		}
		catch (int a)
		{
			printf("%d\n", a);
		}
		catch (char c)
		{
			printf("%d\n", c);
		}
		catch (...)
		{
			puts("未知异常");
		}
	}

}

一个throw只能抛出一个错误,一个catch也只能捕捉一个错误
else if (a == 4 && b == 4) throw(1, 'c');
上面代码中,throw并不是抛出两个,而是采用逗号表达式的形式进行计算,最终抛出的是char类型

异常的匹配规则
1.抛出什么类型,就是去找匹配的类型:int->int,char*->char*,char->char

这里的匹配是很严格的,int不会去找char,char也不会去找int(他们都可以转换成整型,他们都不相互串门,确实很严格)
在这里插入图片描述
在这里插入图片描述

2.抛出错误,往前找,找到最近的位置进行捕捉
在mian函数中添加try-catch,验证抛int异常能不能再mian中捕捉到

double div()
{
	int a, b;
	cin >> a >> b;
	if (a == 0 && b == 0) throw(1);
	else if (b == 0) throw("div发生除0错误");
	else if (a == 3 && b == 3) throw(1.1);
	else if (a == 4 && b == 4) throw(1, 'c');

	return (double)a / b;
}
void test()
{
	while (1)
	{
		try
		{
			cout << div() << endl;
		}
		catch (int a)
		{
			printf("%d\n", a);
		}
		//catch (char c)
		//{
		//	printf("%d\n", c);
		//}
		catch (...)
		{
			puts("未知异常");
		}
	}

}
int main()
{
	try 
	{
		test();
	}
	catch (int a)
	{
		puts("main");
	}
	return 0;
}

在这里插入图片描述
3.对于抛出错误,直接跳到捕捉位置,中间产生的函数栈帧会逐层进行回收,但是throw后的代码不会执行

double div()
{
	int a, b;
	cin >> a >> b;
	if (a == 0 && b == 0) throw(1);
	else if (b == 0) throw("div发生除0错误");
	else if (a == 3 && b == 3) throw(1.1);
	else if (a == 4 && b == 4) throw(1, 'c');
	puts("---");

	return (double)a / b;
}

在这里插入图片描述
没有执行div函数中的puts

异常安全

1.不要再构造函数内部抛异常
2.不要在析构函数内抛异常

异常规范

使用 noexcept关键字表示这个函数不会抛出异常,如果抛出异常会进行报警——这中方式比较强硬
在这里插入图片描述
也可以使用throw(...)再括号中可以添加任意多个类型,添加在某个函数之后,表示这个函数可以抛出的错误类型;不写表示不会抛出,但是如果抛出了也不会报错
在这里插入图片描述

标准异常库

再引入execption库之后就可以使用库中的类了
只需要写一句,就可以捕捉类中所能抛出的所有异常,并使用what函数进行打印

	throw invalid_argument("b=0");
	
	catch (const exception& e)
	{
		cout << e.what() << endl;
	}

在这里插入图片描述
重中之重
1.异常规范有两点:
一、抛出异常类型都继承自一个基类
二、函数是否抛异常、抛什么异常,都使用 func() throw();的方式规范化。
2.异常可能造成内存泄漏,人们为了解决这个问题就产生了——智能指针

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

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

相关文章

UE5动画源码剖析

重点剖析的类&#xff1a; UAnimationInstanceFAnimInstanceProxy 参考&#xff1a;https://zhuanlan.zhihu.com/p/405437842 参考&#xff1a;https://blog.csdn.net/qq_23030843/article/details/109103433 参考&#xff1a;https://ikrima.dev/ue4guide/gameplay-programm…

Opencv——霍夫变换

霍夫直线变换 霍夫直线变换(Hough Line Transform)用来做直线检测 为了加升大家对霍夫直线的理解,我在左图左上角大了一个点,然后在右图中绘制出来经过这点可能的所有直线 绘制经过某点的所有直线的示例代码如下,这个代码可以直接拷贝运行 import cv2 as cv import matplot…

自建DNS劫持服务器,纯内网劫持PS5,屏蔽更新,自动hen

背景&#xff1a;目前PS5首次折腾必须要连外网&#xff0c;还要改DNS&#xff0c;除非使用ESP8266/32&#xff0c; 本文的方法是完全不改DNS&#xff0c;不使用ESP8266,不连接外网的情况下自动折腾 能实现什么&#xff1a; 1.折腾全程不连接外网 2.完全自建hen服务器&#xff…

Vue(十九):ElementUI 扩展实现树形结构表格组件的勾父选子、半勾选、过滤出半勾选节点功能

效果 原理分析 从后端获取数据后,判断当前节点是否勾选,从而判断是否勾选子节点勾选当前节点时,子节点均勾选全勾选与半勾选与不勾选的样式处理全勾选和全取消勾选的逻辑筛选出半勾选的节点定义变量 import {computed, nextTick, reactive, ref} from vue; import {tree} f…

我该坚持纯正原创?还是随波逐流做搬运作者?

本文可能不是一个热点文章&#xff0c;甚至可能不是一个网创者该关心的文章&#xff0c;但是阿阳真心希望&#xff0c;大家可以静下心来看看。 阿阳在网赚领域混了差不多十年&#xff0c;这么多年也经历不少。我不想吹嘘什么&#xff0c;可能是因为年纪大了&#xff0c;觉得低调…

毕业设计----Ajax请求遇到的问题Uncaught TypeError: Cannot read properties of undefi

目录 问题 问题 总的来说&#xff0c;就是我在form表单新增了一个字段&#xff0c;在表单的验证规则中添加了一个名为 code 的自定义验证规则&#xff0c;但是没有提供该规则的实现代码&#xff0c;validate.js提示报错。 所以为了使验证规则生效&#xff0c;添加自定义验证方…

BODIPY FL NHS,BODIPY FL NHS 活化酯,可以实现对特定生物分子的可视化追踪和定位

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;BODIPY FL NHS ester&#xff0c;BODIPY FL NHS&#xff0c;BODIPY FL NHS 活化酯 一、基本信息 产品简介&#xff1a;BODIPY FL NHS ester, by combining BODIPY with NHS ester, this reagent is able to react w…

【CSS】常见

一. 溢出隐藏 1.1 单行文本溢出 .content{max-width:200px; /* 定义容器最大宽度 */overflow:hidden; /* 隐藏溢出的内容 */text-overflow:ellipsis; /* 溢出部分...表示 */white-space: nowrap; /* 确保文本在一行内显示 */ }问题&#xff1a;display:flex 和 ellipsis 冲…

Java学习之基础语法

Java学习之基础语法 本文主要是对于有了其他语言基础的人总结的资料&#xff0c;因此本文只写出了Java与C语言&#xff0c;C等语言的区别之处与部分重点。 1.基础语法&#xff1a; 1.1.包与类&#xff1a; 1.1.1.包&#xff1a; 在Java中&#xff0c;包&#xff08;packag…

Asp.net移除Server, X-Powered-By, 和X-AspNet-Version头

移除X-AspNet-Version很简单,只需要在Web.config中增加这个配置节: <httpRuntime enableVersionHeader"false" />移除Server在Global.asax文件总增加&#xff1a; //隐藏IIS版本 protected void Application_PreSendRequestHeaders() {HttpContext.Current.Res…

【题解 拓扑思维】 C - Building Company

题目描述: 分析&#xff1a; 对于每一个项目&#xff0c;需要满足几个条件&#xff0c;对于每一个条件&#xff0c;表示为第i项工作需要有几个人做。 这几个条件全部满足后&#xff0c;这个项目就可以收入囊下&#xff0c;同时获得新的员工 对于每一个项目的几个条件&#xf…

vxe-table3.0的表格树如何做深层查找,返回搜索关键字的树形结构

vxe-table2.0版本是提供深层查找功能的&#xff0c;因为他的数据源本身就是树形结构&#xff0c;所以深层查找查询出来也是树形结构。 但是vxe-table3.0版本为了做虚拟树功能&#xff0c;将整个数据源由树形垂直结构变成了扁平结构&#xff0c;便不提供深层查询功能&#xff0c…

代码随想录 Leetcode108. 将有序数组转换为二叉搜索树

题目&#xff1a; 代码(首刷自解 2024年1月31日&#xff09;&#xff1a; class Solution { public:TreeNode* recursion(vector<int>& nums, int left, int right) {if (left > right) return nullptr;int mid left (right-left)/2;TreeNode* node new TreeN…

Linux 入门基础知识(一)—— Linux的基本使用

Linux 入门基础知识 一、Linux的基本使用和配置1.1、终端1.2、消耗内存1.3、运行级别1.6、登录前欢迎语1.5、登录后欢迎语1.6、shell1.7、ps aux1.8、设置主机名1.9、whoami和who am i1.10、命令提示符 二、Linux执行命令的过程详解和命令类型2.1、命令执行2.2、hash缓存表2.3、…

在线摸头GIF生成系统源码

在线摸头GIF在线生成器html网页源码&#xff0c;可以点击选择文件按钮&#xff0c;或者直接将图片拖入&#xff0c;即可生成导出

Centos7安装原生Nginx并配置反向代理

一、背景 当我的应用程序需要集群化部署之时&#xff0c;必然需要一个反向代理&#xff0c;当然Nginx的大名&#xff0c;这里不做更多的介绍了&#xff0c;这里介绍一下Nginx常用的四大阵营 1 Ngnix 原生版本 nginx news 2 Nginx Plus 商用版&#xff08;收费的&#xff09…

STM32——USART

一、通信 1.1通信是什么&#xff1b; 通信是将一个设备的数据发送到另一个设备中&#xff0c;从而实现硬件的扩展&#xff1b; 1.2通信的目的是什么&#xff1b; 实现硬件的扩展-在STM32中集成了很多功能&#xff0c;例如PWM输出&#xff0c;AD采集&#xff0c;定时器等&am…

使用AKStream对接gb28181

优点&#xff1a;功能比较多&#xff0c;C#开发的&#xff0c;容易修改&#xff0c;内嵌入了zlmk流媒体服务品&#xff0c;启动简单 缺点&#xff1a;sip对摄像头兼容还有问题&#xff0c;大华接入非常不稳定&#xff0c;注册等待时间久&#xff0c;对海康是正常&#xff0c;占…

Unity_颜色空间GammaLinear

Unity_颜色空间Gamma&Linear Unity颜色空间的选择对于效果的影响具体有多大&#xff1f; 在ProjectSetting -> Player -> OtherSetting -> Rendering设置下的颜色空间选项卡选择颜色空间进行设置&#xff1a; 太深奥的解释一时半会看不懂&#xff0c;找见一个粗…

正则表达式与文本三剑客

目录 一、正则表达式 1. 定义 2. 字符匹配 3. 重复限定符 4. 位置锚点 5. 分组和引用 6. 扩展正则表达式 二、文本三剑客 1. grep 1.1 定义 1.2 语法 1.3 选项 1.4 示例 2. sed 2.1 定义 2.2 通式 2.3 选项 2.4 脚本格式&#xff08;脚本语法&#xff09; 2.…