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

【C++知识点】异常处理

✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:C/C++知识点
📣专栏定位:整理一下 C++ 相关的知识点,供大家学习参考~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
🎏唠叨唠叨:在这个专栏里我会整理一些琐碎的 C++ 知识点,方便大家作为字典查询~

异常处理

概述

C++中的异常处理是处理运行时错误的过程。 执行异常处理,以便即使在运行时出现错误后也能保持正常的应用程序流转

在C++中,异常是在运行时抛出的事件或对象。 所有异常都派生自std::exception类。 它是一个可以处理的运行时错误。 如果我们不处理异常,它就会打印异常消息并终止程序。

异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw

  • try: try 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。
  • catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。
  • throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。

标准异常

C++ 提供了一系列标准的异常,定义在 中,可以使用这些标准的异常。它们是以父子类层次结构组织起来的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zA9mLLOc-1678150496681)(C++笔记.assets/image-20221220093224244.png)]

try/catch语句

try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码(有可能出错的代码)。如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。使用 try/catch 语句的语法如下所示:

try{// 保护代码(有可能出错的代码)
}catch( ExceptionName e1 )
{// catch 块
}catch( ExceptionName e2 )
{// catch 块
}catch( ExceptionName eN ){// catch 块
}

try 块在不同的情境下会抛出不同的异常,可以尝试罗列多个 catch 语句,用于捕获不同类型的异常。

案例

#include <iostream>
using namespace std;
double div(double x, double y) { return (x / y);
}
double add(double x, double y) { return x + y;
}
int main() { double v1 = 50,v2 = 0; double result1 = div(v1,v2); cout << result1 << endl;double result2 = add(v1, v2); cout << result2 << endl; return 0;
}

inf :infinity (linux) 等同于 #INF:infinity (windows)

nan :not a number 等同于 #IND:indeterminate (windows)

inf一般是因为得到的数值,超出浮点数的表示范围(溢出,即阶码部分超过其能表示的最大值);而nan一般是因为对浮点数进行了未定义的操作,如对-1开方。

抛出异常

使用 throw 语句在代码块中的任何地方抛出异常。

throw 语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出的异常的类型。

以下是尝试除以零时抛出异常的实例:

double div(double a, double b){if( b == 0 ) { throw "Division by zero condition!"; } return (a/b);
}

当在div函数里面抛出异常后,程序还是无法正常运行结束。

只抛出,不捕获,程序是无法正常运行的结束的。

捕获异常

catch 块跟在 try 块后面,用于捕获异常。可以指定想要捕捉的异常类型,这是由 catch 关键字后的括号内的异常声明决定的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pCFV3w0l-1678150496685)(C++笔记.assets/image-20221220093834086.png)]

当给div函数加上try catch之后,程序可以正常运行结束了。

try { double result1 = div(v1, v2); cout << result1 << endl;
}
catch (...) { cout << "出错了!" << endl; 
} 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-83doy0Cb-1678150496696)(C++笔记.assets/image-20221220093928883.png)]

打印刚才throw关键字抛出的异常信息:

try { double result1 = div(v1, v2); cout << result1 << endl; 
}
catch (const char * msg) { cerr << msg << endl;
} 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3BdSY4CZ-1678150496698)(C++笔记.assets/image-20221220094022506.png)]

自定义异常

通过继承和重载 exception 类来定义新的异常。

#include <iostream>
#include <exception> 
using namespace std;
class MyException : public exception {
public: const char* what() const throw(){return "my test exception"; }
};
int add(int v1, int v2) { if (v1 > 0) {//如果v1 > 0 ,那么抛出自定义异常myexMyException myex; throw myex;}return v1 + v2;
}
int main() {int num1 = 100, num2 = 200;try { cout << add(num1, num2) << endl;}catch (exception& e) { cout << e.what() << endl;}return 0;
}

what()是一个由 exception 类提供的公共方法。 它用于返回异常的原因。

案例

创建一个数组,创建一个函数取数组元素,当数组下标小于0,或者数组下标大于最大下标时抛出异常,其他正常取值。

  • 下标小于0 underflow
  • 下标大于n-1 overflow
#include<iostream>
using namespace std;
enum index{underflow, overflow};//under下标小于0,over下标超过最大下标
int array_index(int *arr, int n, int index);
int main()
{int *arr = new int[10];for(int i=0; i<10; i++)A[i] = i;try{cout<<array_index(arr,10,5)<<endl;cout<<array_index(arr,10,-1)<<endl;cout<<array_index(arr,10,15)<<endl;}catch(index e){if(e == underflow){cout<<"index underflow!"<<endl;exit(-1);}if(e == overflow){cout<<"index overflow!"<<endl;exit(-1);}}return 0;
}
int array_index(int *arr, int n, int index)
{if(index < 0) throw underflow;if(index > n-1) throw overflow;return arr[index];
}

问题

(1)什么叫异常处理?

答:异常处理是一种程序定义的错误,它对程序的逻辑错误进行设防,并对运行异常加以控制。在C++中,异常处理是对所能预料的运行错误进行处理的一套实现机制。

(2)C++的异常处理机制有何优点?

答:C++的异常处理机制使得异常的引发和处理不必在同一函数中。C++异常处理的目的是在异常发生时,尽可能地减小破坏,周密地善后,而不影响其他部分程序的运行。这样底层的函数可以着重解决具体问题,而不必过多地考虑对异常的处理。上层调用者可以在适当的位置设计对不同类型异常的处理,这在大型程序中是非常必要的

相关文章:

【C++知识点】异常处理

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;C/C知识点 &#x1f4e3;专栏定位&#xff1a;整理一下 C 相关的知识点&#xff0c;供大家学习参考~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;…...

【FATE联邦学习debug】 No module named ‘federatedml‘

直接pip install federatedml是无法找得到这个库的。 这个的原因是环境变量的事情&#xff0c;因为在部署文档中&#xff0c;本身提示我们要更新一些环境变量&#xff0c;如果不export那些变量&#xff0c;下面的fate_test其实也是无法测试成功的。 打开bin/init_env.sh&#x…...

【Git】P1 Git 基础

Git 基础Git 基本概念集中式版本控制工具 与 分布式版本控制工具Git 下载与安装Bash 初始设置创建本地仓库Git 三区概念一个简单的提交流程更改文件后再次提交git 实现版本切换查看提交日志设置 git 快捷键版本切换&#xff08;一&#xff09;版本切换&#xff08;二&#xff0…...

智能交通数据集Rope3D(仅限科研使用)

Rope3D Dataset 官网&#xff1a;https://thudair.baai.ac.cn/index &#xff01;&#xff01;&#xff01;如想要使用Rope3D数据集进行2D检测&#xff0c;最后有我们处理完的数据集链接。 &#xff01;&#xff01;&#xff01; 介绍&#xff1a; DAIR-V2X数据集是首个用于…...

Java虚拟机JVM-面试题

1、Java 虚拟机是如何捕获异常的&#xff1f; 答&#xff1a; 在编译生成的字节码中&#xff0c;每个方法都附带一个异常表。异常表中的每一个条目代表一个异常处理器&#xff0c;并且由 from 指针、to 指针、target 指针以及所捕获的异常类型构成。这些指针的值是字节码索引…...

详细的说说Redis的数据类型

Redis是一个开源的内存数据库&#xff0c;它可以用作缓存、消息代理、实时数据处理和许多其他用途。Redis是一个key-value存储系统&#xff0c;其中数据存储在内存中&#xff0c;并通过网络进行访问。与传统的关系型数据库不同&#xff0c;Redis支持多种数据结构&#xff0c;包…...

798.差分矩阵

输入一个 n行 m列的整数矩阵&#xff0c;再输入 q个操作&#xff0c;每个操作包含五个整数 x1,y1,x2,y2,c&#xff0c;其中 (x1,y1)和 (x2,y2) 表示一个子矩阵的左上角坐标和右下角坐标。每个操作都要将选中的子矩阵中的每个元素的值加上 c。 请你将进行完所有操作后的矩阵输出…...

InfluxDB 2 介绍与使用 flux查询 数据可视化

一、关键概念 相比V1 移除了database 和 RP&#xff0c;增加了bucket。 V2具有以下几个概念&#xff1a; timestamp、field key、field value、field set、tag key、tag value、tag set、measurement、series、point、bucket、bucket schema、organization 新增的概念&…...

Qt QTreeView简单使用

QT-QTreeView使用方法 QTreeView: 用于显示树状结构数据&#xff0c;适用于树状结构数据的操作。 一、初始化 ​ 利用QStandardlternModel来初始化数据&#xff0c;标准的基于项数据的数据模型类&#xff0c; 每个项数据可以是任何数据类型。 // 初始化model QStandardItem…...

Wannacrypt蠕虫老树开花?又见Wannacrypt

Wannacrypt蠕虫是一个在2017年就出现的远古毒株&#xff0c;其利用永恒之蓝漏洞降维打击用户服务器&#xff0c;而后进行扩散勒索&#xff0c;曾经一度风靡全球&#xff0c;可谓是闻者伤心&#xff0c;听着落泪&#xff0c;因为这玩意解密是不可能 解密的。 而2023年的今天&am…...

结合基于规则和机器学习的方法构建强大的混合系统

经过这些年的发展&#xff0c;我们都确信ML即使不能表现得更好&#xff0c;至少也可以在几乎所有地方与前ML时代的解决方案相匹配。比如说一些规则约束&#xff0c;我们都会想到能否把它们替换为基于树的ml模型。但是世界并不总是黑白分明的&#xff0c;虽然机器学习在解决问题…...

Spring Security OAuth2实现多用户类型认证、刷新Token

原本的OAuth2登录支持用户名密码登录&#xff0c;现在还想支持另外用id号码和密码登录。但是OAuth2默认提供的UserDetailsService只允许传入一个参数&#xff1a;想要实现多种用户登录&#xff0c;是不是可以考虑loadUserByUsername方法携带多个参数呢&#xff1f;接下来记录一…...

云计算介绍,让你更了解云计算

同学们好&#xff01; 第一次接触IT行业吗&#xff1f;没关系&#xff0c;看完这篇文章肯定会让你不再陌生。给自己几分钟时间&#xff0c;认真看完哦&#xff01; 1、不知道什么是云计算&#xff1f; 网络计算云计算 官方定义是&#xff1a;通过网络提供可伸缩的分布式计算…...

阿里大佬翻遍全网Java面试文章,总结出这份1658页文档,GitHub收获25K+点赞

就目前大环境来看&#xff0c;跳槽成功的难度比往年高很多。一个明显的感受&#xff1a;今年的面试&#xff0c;无论一面还是二面&#xff0c;都很考验Java程序员的技术功底。这不又到了面试跳槽的黄金段&#xff0c;成功升职加薪&#xff0c;不成功饱受打击。当然也要注意&…...

【JDK1.8 新特性】Lambda表达式

1. 什么是Lambda表达式&#xff1f; Lambda 是一个匿名函数&#xff0c;我们可以把 Lambda 表达式理解为是一段可以传递的代码&#xff08;将代码像数据一样进行传递&#xff09;。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格&#xff0c;使Java的语言表达…...

【Vue.js】Vuex核心概念

文章目录全局状态管理模式Vuexvuex是什么&#xff1f;什么是“状态管理模式”&#xff1f;vuex的应用场景Vuex安装开始核心概念一、State1、单一状态树2、在 Vue 组件中获得 Vuex 状态3、mapState辅助函数二、Getter三、Mutation1、提交载荷&#xff08;Payload&#xff09;2、…...

react router零基础使用教程

安装既然学习 react router 就免不了运行 react安装 reactnpx create-react-app my-appcd my-appnpm start安装 react routernpm install react-router-dom如果一切正常&#xff0c;就让我们打开 index.js 文件。配置路由引入 react-router-dom 的 RouterProviderimport {Route…...

IOC三种依赖注入的方式,以及区别

目录构造方法注入&#xff08;constructor injection&#xff09;setter 方法注入&#xff08;setter injection&#xff09;接口注入&#xff08;interface injection&#xff09;三种方式比较构造方法注入&#xff08;constructor injection&#xff09; 构造方法中声明依赖…...

Ubuntu18安装新版本PCL-1.13,并和ROS自带PCL-1.8共存

文章目录1.安装新版本PCL-1.132.在工程中使用新版本的PCL-1.133.pcl-1.13误装到/usr/local/下如何卸载1.安装新版本PCL-1.13 下载PCL-1.13代码&#xff1a; 修改CMakeLists.txt文件&#xff0c;不编译vtk相关的代码&#xff1a;vtk的问题比较难解决&#xff0c;但是一般我们安…...

计算机图形学08:中点BH算法绘制抛物线(100x = y^2)

作者&#xff1a;非妃是公主 专栏&#xff1a;《计算机图形学》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、算法原理二、…...

基于java的高校辅导员工作管理系统

摘 要网络技术的快速发展给各行各业带来了很大的突破&#xff0c;也给各行各业提供了一种新的管理模块&#xff0c;对于高校辅导员工作管理将是又一个传统管理到智能化信息管理的改革&#xff0c;设计高校辅导员工作管理系统的目的就是借助计算机让复杂的班级信息、学籍信息等管…...

字节3次都没裁掉的7年老测试。掌握设计业务与技术方案,打开上升通道!

前言职场中的那些魔幻操作&#xff0c;研发最烦的是哪个&#xff1f;“面对业务需求的时候&#xff0c;可能都听过这样一句话&#xff1a;这个很简单&#xff0c;直接开发&#xff0c;三天内上线&#xff1b;”朋友说&#xff1a;“产品听了流泪&#xff0c;测试见了崩溃&#…...

详细介绍关于链表【数据结构】

文章目录链表单链表尾插头插尾删第一种方式删除第二种头删查找pos之前插入pos位置删除pos后面插入pos位置后面删除链表 顺序表缺点&#xff1a; 空间不够了 需要扩容&#xff0c;但是扩容是有消耗的头部或中间位置需要插入或删除&#xff0c;需要挪动 &#xff0c;但是挪动是…...

2.3 二分搜索技术

二分搜索算法是运用分治策略的典型例子。给定己排好府的 n个元素a10:n-1]&#xff0c;现要在这n个元素中找出一特定元素3。首先较容易想到的是用顺序搜索方法&#xff0c;逐个比较a10:1-1]中元素&#xff0c;直至找出元素&#xff0c;或搜索遍整个数组后确定&#xff0c;不在其…...

RWEQ模型的土壤风蚀模数估算、其变化归因分析

土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一&#xff0c;土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的首要过程。中国风蚀荒漠化面积达160.74104km2&#xff0c;占国土总面积的16.7%&#xff0c;严重影响这些地区的资源开发和社会经…...

学习streamlit-1

Streamlit A faster way to build and share data apps streamlit在几分钟内就可以将数据脚本转换为可共享的web应用程序&#xff0c;并且是纯python编程&#xff0c;无需前端经验。 快速开始 streamlit非常容易上手&#xff0c;运行demo只需2行代码&#xff1a; pip install…...

GPS定位知识介绍

GPS定位和网络定位 GPS定位需要卫星参与,设备借助搜到的卫星讯号,计算出设备的位置。网络定位是指利用基站、WIFI MAC,获取一个粗略的位置。3D定位和2D 定位 3D一般是指使用至少4颗以上卫星完成的定位。2D一般使用3颗卫星完成的定位过程。...

【Linux】理解Linux环境变量

&#x1f34e;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Linux系统编程 初识环境变量 什么是环境变量 我们平常所用的Linux指令其实也是可执行程序&#xff0c;和我们自己写的二进制程序没什么两样&#xff0c;那么为什么我们在执行自己的程序的时候需要加上 ./…...

ISCSI块存储-集群

ISCSI块存储-集群 1、ISCSI概述 ISCSI与SCSI原理对比 底层都是硬盘 ISCSI第二层就是通过gateway/网络获取–>SCSI&#xff1a;是直连获取 常见的用于ISCSI服务的网络拓扑类型 SAN&#xff1a;Storage Area Network&#xff1a;存储区域网络&#xff1b; 多采用告诉光纤…...

11.Maxwell 部署

Maxwell 部署 一、环境准备 1、确保服务器上已经安装好了zookeeper、kafka、MySQL软件&#xff1b; &#xff08;1&#xff09;启动zookeeper: /usr/app/zookeeper3.4/bin/zkServer.sh start&#xff08;2&#xff09;启动三台主题的kafka 启动&#xff1a;bin/kafka-serv…...

php网站建设制作方案/百度基木鱼建站

智慧警务三维电子沙盘系统 以“情报大数据、指挥扁平化、勤务可视化、情指勤一体化”为设计思想&#xff0c;整合三台合一、有无线通讯、12110短信平台、天网、交通平台、治安卡口、情报平台、一标三实、PGIS、GPS&#xff0c;采用大数据、云计算、三维GIS、移动互联网、物联…...

wordpress chuxia主题/个人模板建站

最近松松团队负责技术的同事任经理跟杰哥爆料&#xff0c;昨天整理公司域名偶然发现&#xff0c;各大域名商都没有.win顶级域名了&#xff0c;都将开始不在提供.win顶级域名服务&#xff0c;国内现有.win顶级域名也将转移到海外注册商。 根据松松团队任经理提供的阿里云通知显示…...

网站建设项目发票/个人网页制作完整教程

http://codeforces.com/problemset/problem/1213/D2 题目大意&#xff1a;给nnn个数&#xff0c;每一次操作可以任意选择一个数aia_{i}ai​&#xff0c;使aiai/2a_{i}a_{i}/2ai​ai​/2(向下取整)。问至少需要多少次操作才能使得序列中有kkk个相等的数。 思路&#xff1a;排序后…...

南宁免费建站模板/百度站长平台网站提交

首先介绍一下辗转相除法&#xff1a; 即m 和 n求最大公因数&#xff08;假设m大于n&#xff09;&#xff0c;先用 m 除以 n &#xff0c;如果余数 r 为 0 &#xff0c;则 n 就是最大公因数&#xff0c;否则&#xff0c;将 n 给了 m &#xff0c;将 r 给了 n &#xff0c;再用 m…...

建设网站可选择的方案/百度关键词推广怎么做

少走弯路的十条忠告走弯路是每个人不可避免的&#xff0c;重要的是如何从前人的走弯路过程中吸取经验&#xff0c;少走弯路&#xff0c;看到这篇文章很有感触&#xff1a;如何在涉世之初少走弯路&#xff0c;有一个好的开端&#xff0c;开始一番成功的事业&#xff1f;以下是一…...

湘潭商城网站建设定制/国际要闻

一、单选题 1&#xff0e;有如下程序段&#xff0c;其执行后的输出结果为&#xff08; &#xff09;。 main() {int i8; while(i>1) {–i; printf(“%d”,i–);} } A. 753 B. 7531 C. 8642 D. 864 2&#xff0e;在下列的数组定义中&#xff0c;哪一个有语法错误&#xff08;…...