c++11:异常

目录

c++异常与c传统处理错误的区别

c语言处理错误的方式

c++处理错误的方式

异常的抛出和处理

demo

异常的重新抛出

demo

异常安全

noexcept   

自定义异常体系


c++舍弃了c语言处理错误的方式,引入了异常来处理错误。

c++异常与c传统处理错误的区别

c语言处理错误的方式

1.暴力的终止程序,如assert终止程序。

2.返回错误码。

c++处理错误的方式

1.触发异常,将异常抛出。

2.捕捉异常,执行异常处理。

相比c语言,c++的处理更柔和,出错了程序也会照常执行,但是执行流会直接跳转到,异常处理的代码块。

异常的抛出和处理

throw:抛出异常,异常可以是任意的类型。

try:捕捉try代码块内抛出的异常

catch:代码块内是处理异常的,catch() 括号内是捕捉异常的类型

注意:

1.异常捕捉的规则是最近,匹配的catch。

2.异常如果到了main函数中还没有被捕获,程序就会直接终止。

3.通常会在最后加上catch(...),catch(...)可以捕获任意异常,这个主要就是增强代码的健壮性,防止,漏捕获异常,导致程序终止。

4.当异常出发throw之后的代码不会在继续执行,执行流跳转到,与抛出类型相同最近的catch代码块。

demo

简单的除零错误

#include<iostream>
using namespace std;double Division(int a, int b)
{// 当b == 0时抛出异常if (b == 0){throw "Division by zero condition!";//抛出了一个cosnt char*的异常cout << "~~~~~~~~~~~~~~" << endl;}elsereturn ((double)a / (double)b);
}int main()
{try {Division(1,2);Division(1,0);}catch (const char * message)//这个catch只能捕捉const char*的异常{cout << message << endl;}catch (...)//捕捉任意的异常{cout<<"unknown execption" << endl;}cout << "-------------------" << endl;return 0;
}

异常的重新抛出

当异常抛出的时候,执行流回跳转,这时候就出现一个问题,在抛出异常之前动态开辟了一块空间,但是我这块空间还没来得及释放,但是执行流已经跳走了,这就会导致资源的泄露。

这种情况需要将异常处理之后,重新抛出,更好的办法就是使用智能指针,使用对象管理资源。

demo

#include<iostream>
using namespace std;double Division(int a, int b)
{// 当b == 0时抛出异常if (b == 0){throw "Division by zero condition!";cout << "~~~~~~~~~~~~~~" << endl; //没有被打印}elsereturn ((double)a / (double)b);
}void Func()
{int* arry = new int[5];try{int len, time;cin >> len >> time;cout << Division(len, time) << endl;}catch (...){delete[] arry;cout << "already delete" << endl;throw;}delete[] arry;
}int main()
{try{Func();}catch (const char * message){cout << message << endl;}catch (...){cout<<"unknown execption" << endl;}//cout << "-------------------" << endl;return 0;
}

异常安全

有一些的函数是不可以抛异常的,就像构造函数和析构函数。

构造函数通常用来初始化对象,如果初始化到一半,抛异常执行流跳走,会产生一个只初始化一半的怪物,会引起更多的异常

构造函数通常用来清理资源,如果抛异常执行流跳走,会导致有的资源未被释放,导致资源泄露。

noexcept   

由noexcept 修饰的函数,不会抛出异常。

自定义异常体系

在实际开发中,都会有一个异常的体系,因为如果异常是随便抛出的,那可就坏事了,程序员A抛出了一个int,程序员B抛出了一个char*。

异常是不能随便抛的,是要有严格规范的。

通常都会使用多态,catch基类可以捕捉抛出的派生类的异常。

使用基类调用,what这个虚函数。

class Exception
{
public:Exception(const string& errmsg, int id):_errmsg(errmsg),_id(id){}virtual string what() const{return _errmsg;}protected:string _errmsg;int _id;
};class SqlException : public Exception
{
public:SqlException(const string& errmsg, int id, const string& sql):Exception(errmsg, id), _sql(sql){}virtual string what() const{string str = "SqlException:";str += _errmsg;str += "->";str += _sql;return str;}private:const string _sql;
};

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

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

相关文章

js什么情况下使用同步,什么时候异步加载

JavaScript 中的同步和异步操作主要取决于代码的执行过程。以下是一些常见的同步和异步使用场景: 同步操作: 基本操作: 赋值、算术运算、逻辑判断等基本语句,这些操作都是同步执行的。 DOM 操作: 获取、修改 DOM 元素的属性和内容,这些操作都是同步执行的。 阻塞操作: 一些耗…

el-table表头使用el-dropdown出现两个下拉框

问题描述&#xff1a;el-table在固定右边列时&#xff0c;表头使用el-dropdown会出现两个下拉框&#xff0c;如图所示&#xff1a; 解决方法&#xff1a; 1.只显示第一个下拉框&#xff0c;通过控制样式将其他的下拉框display:none; 2.如图所示&#xff0c;修改插槽写法&…

<数据集>学生课堂行为识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;13899张 标注数量(xml文件个数)&#xff1a;13899 标注数量(txt文件个数)&#xff1a;13899 标注类别数&#xff1a;8 标注类别名称&#xff1a;[js, tt, dk, zt, dx, zl, jz, xt] # 举手 js # 抬头听课 …

从FasterTransformer源码解读开始了解大模型(2.3)代码通读04

从FasterTransformer源码解读开始了解大模型&#xff08;2.3&#xff09;代码解读04-forward函数 写在前面的话 本篇的内容继续解读forward函数&#xff0c;从972行开始进行解读 零、embedding函数 让我们考虑一种不包含prefix_soft_prompt的情况&#xff0c;从999行的embe…

在 PostgreSQL 里如何实现数据的冷热数据分层存储的自动化策略调整?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何实现数据的冷热数据分层存储的自动化策略调整 在 PostgreSQL 里如何实现数据的冷…

【数据分享】2013-2022年我国省市县三级的逐日SO2数据(excel\shp格式\免费获取)

空气质量数据是在我们日常研究中经常使用的数据&#xff01;之前我们给大家分享了2000——2022年的省市县三级的逐日PM2.5数据和2013-2022年的省市县三级的逐日CO数据&#xff08;均可查看之前的文章获悉详情&#xff09;&#xff01; 本次我们分享的是我国2013——2022年的省…

mongodb数据导出与导入

一、先去检查mongodump mongodump --version 如果报 mongodump version: built-without-version-string 或者其他的较老的版本&#xff0c;直接去下载最新的【传送门】 【以Ubuntu18.04为例】 安装工具 假设你下载的是 .tgz 文件&#xff08;适用于 Linux 系统&#xff09;&am…

【项目】星辰博客介绍

目录 一、项目背景 二、项目功能 1. 登录功能&#xff1a; 2. 列表页面&#xff1a; 3. 详情页面&#xff1a; 4. 写博客&#xff1a; 三、技术实现 四、功能页面展示 1. 用户登录 2. 博客列表页 3. 博客编辑更新页 4.博客发表页 5. 博客详情页 五.系统亮点 1.强…

高性能图数据库Neo4j从入门到实战

图数据库Neo4j介绍 什么是图数据库&#xff08;graph database&#xff09; 随着社交、电商、金融、零售、物联网等行业的快速发展&#xff0c;现实社会织起了了一张庞大而复杂的关系网&#xff0c;传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随数据量呈…

【数据结构】栈和队列的深度探索,从实现到应用详解

&#x1f48e;所属专栏&#xff1a;数据结构与算法学习 &#x1f48e; 欢迎大家互三&#xff1a;2的n次方_ &#x1f341;1. 栈的介绍 栈是一种后进先出的数据结构&#xff0c;栈中的元素只能从栈顶进行插入和删除操作&#xff0c;类似于叠盘子&#xff0c;最后放上去的盘子最…

广州机房搬迁网络部署方案

新机房网络部署应包括核心模块、业务模块、光传输模块、安全模块、流量采集模块、路由模块、带外管理模块等&#xff0c;每个模块都根据业务需求规划成多个POD&#xff08;Point Of Delivery&#xff0c;基本物理设计单元&#xff09;。 核心模块部署主要实现各业务模块的高速互…

HighConcurrencyCommFramework c++通讯服务器框架 :目录,修改标题,配置,日志打印

目录规划 nginx 根目录下的三个文件 makefile :编译项目的入口&#xff0c;编译项目从这里开始 config.mk&#xff1a;也是个配置脚本用来增加变动的东西&#xff0c;应付可变 common.mk&#xff1a;最核心的编译脚本&#xff0c;每个子目录都要被编译.cpp程序 配置文件 配…

postman创建mock server

B站博主的说明&#xff1a;

《python语言程序设计》第6章2题(求一个整数各个数字的和)编写一个函数

求一个整数各个数字的和编写一个函数&#xff0c;计算一个整数各个数字的和&#xff0c; def sumDigits(n):a n // 100b n % 100 // 10c n % 100 % 10print(f"{n}数&#xff0c;分成个&#xff0c;十&#xff0c;百&#xff0c;{a}{b}{c}", a b c)sumDigits(23…

算法日记day 16(二叉树的广度优先遍历|反转、对称二叉树)

一、二叉树的层序遍历 题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3]…

linux 用户/内核空间分配原理,修改方法

32位Linux系统为例&#xff0c;4GB的地址空间通常被分为&#xff1a; 3GB 用户空间1GB 内核空间 这种分配方式被称为3/1分割&#xff08;3G/1G split&#xff09;。 修改分配大小 Linux内核提供了一个启动参数 mem 来调整这个分割。例如&#xff1a; 使用 mem3G 会将用户空…

SQUID - 形状条件下的基于分子片段的3D分子生成等变模型 评测

SQUID 是一个形状条件下基于片段的3D分子生成模型&#xff0c;给一个3D参考分子&#xff0c;SQUID 可以根据参考分子的形状&#xff0c;基于片段库&#xff0c;生成与参考分子形状非常相似的分子。 SQUID 模型来自于 ICLR 2023 文章&#xff08;2022年10月6日提交&#xff09;&…

vue+watermark-dom实现页面水印效果

前言 页面水印大家应该都不陌生&#xff0c;它可以用于验证数字媒体的来源和完整性&#xff0c;还可以用于版权保护和信息识别&#xff0c;这些信息可以在不影响媒体质量的情况下嵌入&#xff0c;‌并在需要时进行提取。‌本文将通过 vue 结合 watermark-dom 库&#xff0c;教大…

OpenCV 像素操作—证件照换底色详细原理 C++纯手写实现

文章目录 总体步骤1.RGB转HSV2.找出要换的底色3.取反&#xff0c;黑白颠倒4.将原图像的非背景部分复制到新背景上 完整代码1.C纯手写版2.官方API版本 总体步骤 1.RGB转HSV 为什么一定要转为HSV 颜色空间&#xff1f; 将图像从BGR颜色空间转换为HSV颜色空间是因为HSV颜色空间更…

redis+spring面试题

redis使用场景 缓存热点数据分布式锁存储token存储短信验证码计数器全局唯一数排行榜限流购物车关注粉丝 缓存失效 缓存穿透 缓存空结果布龙过滤器 缓存击穿 全局锁设置永不过期 缓存雪崩 设置高可用集群设置不同的过期时间本地二级缓存&#xff0c;限流加降级 数据一致性…