【C++】异常处理之throw、catch、try、局部资源管理、标准异常库

news2025/6/21 0:33:05

一、抛出异常

异常处理机制两个主要成分:

  1. 异常的鉴定与发出;
  2. 异常的处理方式。

C++通过throw表达式产生异常:

inline void Triangular_iterator::
check_integrity()
{
	if(_index>=Triangular::max_elems)
	{
		throw iterator_overflow(_index, Triangular::_max_elems);
		if(_index >= Triangular::elems.size())
		{
			Triangular::gen_elemts(_index+1);
		}
	}
}

//换个方式:明确指出被抛出的对象名称
if(_index>=Triangular::max_elems)
{
	iterator_overflow ex(_index,Triangular::_max_elems);
	throw ex;
}

异常对象

最简单的异常对象可以设计为:整数或字符串:

throw 42;
throw "panic:no buffer!";

异常类

大部分时候,被抛出的异常都属于特定的异常类:

class iterator_overflow{
public:
	iterator_overflow(int index,int max):_index(index),_max(max){}

	int index(){return _index;}
	int max(){return _max;}
	
	void what_happened(ostream &os=cerr)
	{
		os<<"Internal error:current index "<<_index
		  <<" exceeds maximum bound: "<<_max;
	}
	
private:
	int _index;
	int _max;
};

二、捕获异常

catch子句

由三部分组成:

  1. 关键字catch;
  2. 小括号内的一个类型或对象;
  3. 大括号内的一组语句(用以处理异常)。
extern void log_message(const char*);
extern string err_messages[];
extern ostream log_file;

bool some_function()
{
	bool status = true;
	
	catch(int errno)
	{
		log_message(err_messages[errno];
		status = false;
	}
	
	catch(const char *str)
	{
		log_message(str);
		status = false;
	}
	
	catch(iterator_overfloww &iof)
	{
		iof.what_happened(log_file);
		status = false;
	}
	
	return status;
}

//逐个处理
throw 42;
throw "panic:no buffer!";
throw iterator_overflow(_index,Triangular::_max_elems);

有时候我们可能无法完成异常的完整处理。在记录信息之外,我们或许需要重新抛出异常,以寻求其他catch子句的协助:

catch(iterator_overflow &iof)
{
	log_message(iof.what_happened());
	
	//重新抛出异常,另一个catch子句来接手处理
	throw;//甚至只可以出现在catch子句中
}

捕获任何类型的异常:catch(...)

catch(...)
{
	log_message("exception of unknown type");
	//清理后退出
}

三、提炼异常

try块

  • try语句块用来处理异常,try语句块以关键字try开始,以一个或多个catch子句结束,try语句块中代码抛出的异常通常会被某个catch子句处理;
  • 当函数的try块发生某个异常,但没有相应的catch子句将它捕获,此函数便会转到terminate的标准库函数,terminate会终止当前进程的执行,由异常处理机制接管,沿着“函数调用链”一路回溯,搜寻符合条件的catch子句。
bool has_elem(Triangular_iterator first, Triangular_iterator last, int elem)
{
	bool status = true;
	try
	{
		while(first != last)
		{
			if(*first == elem)
			{
				return status;
			}
			++first;
		}
	}
	catch(iterator_overflow &iof)
	{
		log_message(iof.what_happened());
		iog_message("check if iterators address same container");
	}
	//try块内的程序代码执行时,如果有任何异常抛出,
	//只捕获其中类型为iterator_overflow的异常。
	status = false;
	return status;
}

四、局部资源管理

函数执行之初所分配的资源不一定最终会被释放掉。

解决:资源管理的手法(在初始化阶段即进行资源请求)

#include<memory>

void f()
{
	auto_ptr<int>p(new int);
	MutexLock m1(m);
	process(p);
	//p和m1的析构函数在此被悄悄调用
}

auto_ptr

标准类模板:自动删除通过new表达式分配的对象。
auto_ptr将*运算符和->运算符予以重载,方式类似迭代器类那样,我们得以像使用一般指针一样地使用auto_ptr对象:

auto_ptr<string>aps(new string("vermeer"));
string *ps=new string("vermmer");
if((aps->size()==ps->size())&&(*aps==*ps))
//...

五、标准异常

参考:C++标准异常库、编写自己的异常类
C++标准异常库

自己编写的异常类继承给exception基类:

  • 所有的异常类都有一个what()方法,返回const char* 类型,描述异常信息;
  • 可被任何“打算捕获抽象基类exception”的程序代码所捕获。

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

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

相关文章

打造炫酷效果:用Java优雅地制作Excel迷你图

摘要&#xff1a;本文由葡萄城技术团队原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 迷你图是一种简洁而有效的数据可视化方式&#xff0c;常用于展示趋势和变化。它通常由一…

找单身狗2

一个数组中只有两个数字是出现一次&#xff0c;其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。 例如&#xff1a;有数组的元素是&#xff1a;1,2,3,4,5,1,2,3,4,6&#xff0c;只有5和6只出现1次&#xff0c;要找出5和6。 这里我们不妨回忆一下之前找单身…

VS2022新建项目时没有ASP.NET Web应用程序 (.NET Framework)

问题&#xff1a;如图&#xff0c;VS2022新建项目时没有“ASP.NET Web应用程序 &#xff08;.NET Framework&#xff09;”的选项解决方法&#xff1a;点击跳转至修改安装选项界面选择安装该项即可&#xff1a;

金x软件有限公司安全测试岗位面试

目录 一、自我介绍 二、你是网络空间安全专业的&#xff0c;那你介绍下网络空间安全这块主要学习的东西&#xff1f; 三、本科专业是网络工程&#xff0c;在嘉兴海视嘉安智城科技有限公司实习过&#xff0c;你能说下干的工作吗&#xff1f;&#xff08;没想到问的是本科实习…

webdriver.Chrome()没反应

今天学习爬虫安装selenium之后刚开始webdriver.Chrome()正常 后面运行突然卡在这一步了 百度发现是版本不匹配 我们下载旧版本的chrome Download Google Chrome 95.0.4638.69 for Windows - Filehippo.com 禁用chrome的自动更新 打开文件所在位置 点击Google文件夹 右键up…

python:从Excel或者CSV中读取因变量与多个自变量,用于训练机器学习回归模型,并输出预测结果

作者:CSDN @ _养乐多_ 本文详细记录了从Excel读取用于训练机器学习模型的数据,包括独立变量和因变量数据,以供用于机器学习模型的训练。这些机器学习模型包括但不限于随机森林回归模型(RF)和支持向量机回归模型(SVM)。随后,我们将测试数据集应用于这些模型,进行预测和…

PyTorch深度学习实战(20)——从零开始实现Fast R-CNN目标检测

PyTorch深度学习实战&#xff08;20&#xff09;——从零开始实现Fast R-CNN目标检测 0. 前言1. Fast R-CNN1.1 模型架构1.2 R-CNN 与 Fast R-CNN 对比 2. 实现 Fast R-CNN 目标检测2.1 数据处理2.2 模型构建2.4 模型训练与测试 小结系列链接 0. 前言 R-CNN 的主要缺点之一是生…

研发必会-异步编程利器之CompletableFuture(上)

微信公众号访问地址&#xff1a; 近期热推文章&#xff1a; 1、springBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表; 2、SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据; 3、基于Redis的Geo实现附近商铺搜索(含源码) 4、基于Redis实现关注、取…

应用在SMPS中的GaN/氮化镓

开关模式电源&#xff08;Switch Mode Power Supply&#xff0c;简称SMPS&#xff09;&#xff0c;又称交换式电源、开关变换器&#xff0c;是一种高频化电能转换装置&#xff0c;是电源供应器的一种。其功能是将一个位准的电压&#xff0c;透过不同形式的架构转换为用户端所需…

文心一言Plugin实战来了,测试开发旅游攻略助手

刚刚过去的8月&#xff0c;百度WAVE SUMMIT 深度学习开发者大会上&#xff0c;重磅发布文心一言的五个原生插件&#xff1a;百度搜索、览卷文档&#xff08;基于文档的交互&#xff09;、E 言易图&#xff08;数据洞察图表生成&#xff09;、说图解画&#xff08;基于图片的交互…

基于Redis+Cookie实现Session共享

分布式项目中要实现单点登录&#xff08;SSO - Single Sign On&#xff09;&#xff1a;对于同一个客户端&#xff08;例如 Chrome 浏览器&#xff09;&#xff0c;只要登录了一个子站&#xff08;例如 a.com&#xff09;&#xff0c;则所有子站&#xff08;b.com、c.com&#…

uniapp 运行到 app 报错 Cannot read property ‘nodeName‘ of null

uniapp 运行到某一个页面&#xff0c;报错&#xff0c;h5没有问题 Unhandled error during execution of scheduler flush. This is likely a Vue internals bug. Please open an issue at https://new-issue.vuejs.org/?repovuejs/coreat <GuiPagecustomHeadertruecustomF…

vue3和vue2生命周期​

vue2生命周期​ 每一个vue实例从创建到销毁的过程&#xff0c;就是这个vue实例的生命周期。在这个过程中&#xff0c;他经历了从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程 beforeCreate&#xff1a;是第一个生命周期函数&#xff0c;表示…

【微服务部署】七、使用Docker安装Nginx并配置免费的SSL证书步骤详解

SSL&#xff08;Secure Socket Layer&#xff0c;安全套接字层&#xff09;证书是一种数字证书&#xff0c;用于加密网站与访问者之间的数据传输。SSL证书是网站安全和可靠性的重要保证&#xff0c;是建立信任和保护用户隐私的重要手段。其作用可以总结为以下几点&#xff1a; …

Hadoop3教程(一):Hadoop的定义、组成及全生态概览

文章目录 &#xff08;1&#xff09;定义1.1 发展历史1.2 三大发行版本1.3 Hadoop的优势1.4 Hadoop的组成 &#xff08;13&#xff09;HDFS概述&#xff08;14&#xff09;Yarn架构&#xff08;15&#xff09;MapReduce概述&#xff08;16&#xff09; HDFS、YARN、MapReduce三…

git合并分支-IDEA

有1个主分支&#xff0c;我从主分支拉取过来了&#xff0c;数据然后改好了&#xff0c;现在想合并到主分支上&#xff0c;并且将主分支的内容更新到我的分支下。用git怎么操作? 1.将主分支(master)的内容合并到我的分支(master-shi)中 在我的分支下执行 git merge master ID…

自己一天在家没事就爱折腾

来吃馍馍了&#xff0c;看我自己动手做的花卷&#xff0c;味道一定美极了&#xff0c;哈哈&#xff0c;有没有想吃的呀&#xff01;快来我家&#xff0c;我和你一起分享。

Vue项目 -- 解决Eslint导致的console报错问题

在利用vue-cli3构建的项目中引入eslint进行语法检查时&#xff0c;使用console.log(‘xxx’)时&#xff0c;控制台抛出了Unexpected console statement (no-console) 异常&#xff0c; 例&#xff1a;一使用console就提示报错 解决办法是&#xff1a; 在 .eslintrc.js 文件中…

[Error]在Swift项目Build Settings的Preprocessor Macros中定义的宏无效的问题

问题 如图&#xff0c;在Build Settings -> Preprocessor Macros中添加了ISADEMO1。但在代码中判断无效&#xff0c;还是会输出“isn’t ADemo” #if ISADEMOprint("is ADemo") #elseprint("isnt ADemo") #endif解决 如图&#xff0c;要让Preproces…

RuntimeError: “LayerNormKernelImpl“ not implemented for ‘Half‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…