【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 )

news2025/1/21 6:34:36

文章目录

  • 一、异常处理
    • 1、异常概念引入
    • 2、抛出异常语法
    • 3、捕获异常语法
    • 4、异常捕获流程
  • 二、异常处理代码示例
    • 1、错误代码示例 - 抛出异常 / 不捕获异常
    • 2、正确代码示例 - 抛出异常 / 捕获异常
    • 3、正确代码示例 - 抛出异常 / 捕获异常不处理继续抛出异常





一、异常处理




1、异常概念引入


异常是一种 特殊的程序流控制机制 , 用于处理程序中可能出现的错误或异常情况 ;

当程序执行错误时 , 由 throw 关键字抛出异常 , 并即跳转到相应的异常处理程序中 ; 如果没有适当的异常处理程序处理该异常 , 程序会崩溃终止 ;


异常与函数对比 :

  • 函数 是一种 以 栈结构 展开的上下函数衔接的程序控制系统 ;
  • 异常 是一种 特殊的程序流控制机制 , 用于处理程序中可能出现的错误或异常情况 ; 异常 依附于栈结构 , 却可以同时设置多个 异常类型 作为 异常捕获条件 ;

异常是跨函数的 , 下图中 函数 f 调用 函数 g , 函数 g 调用 函数 h ;
在这里插入图片描述
在 函数 h 中抛出异常 , 异常会沿着函数 调用顺序 , 先抛给 函数 g , 如果 g 不处理 , 则继续向上抛给 函数 f ;

上述 异常处理 机制 , 可以在不同的函数中 进行 抛出异常 和 处理异常 的操作 ;

这样 函数设计开发时 只需要解决具体的问题 , 不需要过多考虑 异常处理 ;


2、抛出异常语法


抛出异常 语法 : 使用 throw 关键字 , 抛出异常对象 ;

throw 异常对象;

代码示例 : 在下面的函数中 , 抛出一个 int 类型的异常 ;

// 1. 在 函数 中 抛出异常
void fun(int a) {
	if (a == 0) {
		// 抛出一个 int 类型的异常
		throw 2;
	}
}

3、捕获异常语法


异常捕获 语法 : 在 try 代码块中执行 可能抛出异常的 代码 , 如果出现异常 , 就可以在 catch 分支中进行捕获 ;

try {
	// 出现异常的代码块
} catch( 异常类型声明 )

代码示例 : 下面的代码中 , 捕获 try 代码块中产生的异常 ,

  • 如果捕获到 int 类型的异常 , 则执行 catch (int e) 分支中的代码 ,
  • 如果捕获到其它类型的异常 , 则执行 catch ( … ) 分支中的代码 ;
	// 2. 捕获并处理异常
	try
	{
		// 调用可能产生异常的函数
		fun(0);
	}
	catch (int e)
	{
		cout << "捕获到异常 : " << e << endl;
	}
	catch ( ... )
	{
		// 捕获 ... 可以捕获未知其它类型的异常
		cout << "捕获到未知类型异常"<< endl;
	}

4、异常捕获流程


异常捕获流程 :

  • 抛出异常 : 如果遇到错误 , 需要抛出异常 , 可以使用 throw 关键字 , 抛出一个异常对象 , 这个异常对象可以是任意类型 , 如 int 类型 ;
  • try 代码块处理异常 : 在 try 代码块中 , 执行可能抛出异常的代码 , 上方的代码顺序执行到达 try 代码块时 , 则进入 try 代码块 继续执行其中的代码 ;
    • 正常执行 : 如果 try 保护段代码正常执行 , 没有出现异常 , 则执行完毕后继续执行 后续代码 , 最后一个 catch 分支之后的代码 ;
    • 出现异常 :
      • 捕获异常 : 如果出现了异常 , 恰好被 catch 分支捕获 , 则执行 catch 分支代码 ;
        • 处理异常 : 如果能处理该异常 , 则处理异常错误 ;
        • 继续向上抛出异常 : 如果无法处理 , 则继续向上抛出给调用者 , 让上一级函数处理 ;
      • 未捕获异常 : 如果出现了异常 , 没有被 catch 分支捕获 , 则运行 terminate 函数 , 在该函数中调用 abort 终止程序 ;




二、异常处理代码示例




1、错误代码示例 - 抛出异常 / 不捕获异常


错误代码示例 : 在下面的代码中 , 没有捕获异常 , 则在执行时会报错 : " 0x755FF932 处(位于 HelloWorld.exe 中)有未经处理的异常 " ;

#include "iostream"
using namespace std;

// 1. 在 函数 中 抛出异常
void fun(int a) {
	if (a == 0) {
		// 抛出一个 int 类型的异常
		throw 2;
	}
}

int main() {

	// 调用可能产生异常的函数
	fun(0);

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};

执行结果 :

0x755FF932(位于 HelloWorld.exe 中)有未经处理的异常: 
Microsoft C++ 异常: int,位于内存位置 0x00F6FB6C 处。 

在这里插入图片描述


2、正确代码示例 - 抛出异常 / 捕获异常


异常捕获完整代码示例 :

#include "iostream"
using namespace std;

// 1. 在 函数 中 抛出异常
void fun(int a) {
	if (a == 0) {
		// 抛出一个 int 类型的异常
		throw 2;
	}
}

int main() {

	// 2. 捕获并处理异常
	try
	{
		// 调用可能产生异常的函数
		fun(0);
	}
	catch (int e)
	{
		cout << "捕获到异常 : " << e << endl;
	}
	catch ( ... )
	{
		// 捕获 ... 可以捕获未知其它类型的异常
		cout << "捕获到未知类型异常"<< endl;
	}

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};

执行结果 :

捕获到异常 : 2
请按任意键继续. . .

在这里插入图片描述


3、正确代码示例 - 抛出异常 / 捕获异常不处理继续抛出异常


异常是跨函数的 , 异常会从本函数中抛给调用本函数的调用者 ( 调用函数 ) ;

  • 如 : 在 main 函数中调用 fun 函数 , 如果 fun 函数中抛出异常 , 则抛给了 main 函数 , 需要在 main 函数中捕获并处理异常 ;

在下面的示例中 , fun2 函数中捕获 fun 函数中的 异常未处理 , 抛到了 main 函数中 ;

main 函数中的异常必须处理 , 否则程序崩溃 ;


代码示例 :

#include "iostream"
using namespace std;

// 1. 在 函数 中 抛出异常
void fun(int a) {
	if (a == 0) {
		// 抛出一个 int 类型的异常
		throw 2;
	}
}

// 3. 捕获异常不处理 , 继续向上抛出
void fun2(int a) {

	try
	{
		// 执行可能抛出异常的函数
		fun(a);
	}
	catch (int e)
	{
		// 捕获到了异常, 但是不处理继续向上抛出
		throw;
	}

}

int main() {

	// 2. 捕获并处理异常
	try
	{
		// 调用可能产生异常的函数
		//fun(0);

		// 异常是跨函数的
		// 调用可能产生异常的函数
		// 该 fun2 函数中捕获 fun 函数中的 异常未处理 
		// 抛到了 main 函数中
		fun2(0);
	}
	catch (int e)
	{
		cout << "捕获到异常 : " << e << endl;
	}
	catch ( ... )
	{
		// 捕获 ... 可以捕获未知其它类型的异常
		cout << "捕获到未知类型异常"<< endl;
	}

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};

执行结果 :

捕获到异常 : 2
请按任意键继续. . .

在这里插入图片描述

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

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

相关文章

【导航控制器的基本使用 Objective-C语言】

一、导航控制器的基本使用 1.那接下来呢,我们就要讲解这个重中之重了啊,导航控制器,大家一定要注意听,那首先呢,我们先来看ppt,引导一下, 导航控制器.pptx,打开, 那接下来呢,我们就要学习这个多控制器的管理了, 里面的第一个内容,叫做导航控制器, 那今天呢,我们…

unity学习笔记08

一、预制体 在Unity中&#xff0c;预制体&#xff08;Prefab&#xff09;是一种特殊类型的游戏对象&#xff0c;它允许你创建、配置和保存一个对象&#xff0c;然后在场景中多次使用。预制体的使用使得开发者能够更加灵活和高效地设计和管理游戏对象。 1.创建预制体 可以选择…

在很多nlp数据集上超越tinybert 的新架构nlp神经网络模型

在很多nlp数据集上超越tinybert 的新架构nlp神经网络模型 网络结构图测试代码网络结构图 测试代码 import paddle import numpy as np import pandas as pd from tqdm import tqdmclass FeedFroward(paddle.nn.Layer):

专业的调查问卷平台推荐:提升数据收集与分析效率

无论是学生还是职场人士&#xff0c;想做好一份调查问卷&#xff0c;关键先要确定调查的主题&#xff0c;然后确定调查人群&#xff0c;编辑问题&#xff0c;最后能够尽可能的美化问卷调查的主题。 想要做到这几点&#xff0c;就要要求问卷调查平台: 1、能够帮助你快速制作出一…

TA-Lib学习研究笔记(一)

TA-Lib学习研究笔记&#xff08;一&#xff09; 1.介绍 TA-Lib&#xff0c;英文全称“Technical Analysis Library”,是一个用于金融量化的第三方库&#xff0c;涵盖了150多种交易软件中常用的技术分析指标&#xff0c;如RSI,KDJ,MACD, MACDEXT, MACDFIX, SAR, SAREXT, MA,SM…

Ubuntu16.04.4系统本地提权实验

目录 1.介绍&#xff1a; 2.实验&#xff1a; 3.总结&#xff1a; 1.介绍&#xff1a; 1.1&#xff1a;eBPF简介&#xff1a;eBPF(extendedBerkeleyPacketFilter)是内核源自于BPF的一套包过滤机制&#xff0c;BPF可以理解成用户与内核之间的一条通道&#xff0c;有非常强大的…

免费好用的伪原创工具推荐,都是国内的人工智能AI

在当今数字化信息爆炸的时代&#xff0c;创作者们为了在激烈的竞争中脱颖而出&#xff0c;常常需要花费大量时间来创作独特的内容。然而&#xff0c;有时候时间并不是每个人都拥有充足的资源。于是&#xff0c;一些免费智能伪原创工具成为了许多创作者的利器&#xff0c;能够在…

fastReID论文总结

fastReID论文总结 fastReIDReID所面临的挑战提出的背景概念&#xff1a;所谓ReID就是从视频中找出感兴趣的物体&#xff08;人脸、人体、车辆等&#xff09;应用场景&#xff1a;存在的问题&#xff1a;当前的很多ReID任务可复用性差&#xff0c;无法快速落地使用解决方式&…

将原生Spring项目中某些配置文件中的易变内容参数化

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

Making Reconstruction-based Method Great Again for Video Anomaly Detection

Making Reconstruction-based Method Great Again for Video Anomaly Detection 文章信息&#xff1a; 发表于ICDM 2022&#xff08;CCF B会议&#xff09; 原文地址&#xff1a;https://arxiv.org/abs/2301.12048 代码地址&#xff1a;https://github.com/wyzjack/MRMGA4VAD…

PM2 在线和离线部署uvicorn和fastapi项目过程

PM2介绍 PM2 is a daemon process manager that will help you manage and keep your application online 24/7 PM2是一个后台进程管理工具&#xff0c;能帮助管理应用和维持应用7*24小时运行。 PM2在线安装 npm install pm2 -gPM2离线安装(适用于内网) 参见 如何离线安装pm2…

Error running OrderServiceBoot. Command line is too long.

微服务启动不成功&#xff0c;报Error running OrderServiceBoot. Command line is too long. Shorten the command line via JAR manifest or via a classpath file and rerun. 解决&#xff1a; 方法一&#xff1a; 右上角启动小三角 -->Edit configuration–>-右侧…

接单平台在精不在多,劝诸位程序员找个好平台!

程序员想找兼职搞副业&#xff0c;结果知乎上逛了一大圈&#xff0c;各种平台推荐&#xff0c;可以说是眼花缭乱。要么就是平台一搜&#xff0c;各种劝退&#xff01;好好好&#xff0c;就问一句&#xff0c;还搞不搞&#xff1f;Of course~有钱还不赚的是傻子。加班摸鱼的时候…

多线程(初阶四:synchronized关键字)

目录 一、加锁的目的 二、加锁和解锁 三、加锁后是否会出现线程安全问题 1、两个线程&#xff0c;针对不同对象加锁 2、一个线程加锁&#xff0c;一个线程不加锁 3、针对加锁操作的一些混淆理解 &#xff08;1&#xff09;多个线程调用同一个类的方法&#xff0c;对其方…

(一)基于高尔夫优化算法GOA求解无人机三维路径规划研究(MATLAB)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、高尔夫优化算法GOA简介 高尔夫优化算法…

8、CobaltStrike使用

文章目录 一、实验拓扑图二、实验步骤 一、实验拓扑图 二、实验步骤 1、登录"Kali"操作机&#xff0c;在终端中进入CS文件夹&#xff0c;然后使用命令chmod x teamserver给teamserver文件赋予执行权限&#xff0c;然后查看当前主机的本地IP地址。 2、启动服务端服务…

关于图像识别,你不得不知的三大要点

图像识别的重要性 图像识别不仅可以加速处理繁琐的任务&#xff0c;而且还可以比人工图像检查更快速或更准确地处理图像。图像识别是应用于诸多领域的关键技术&#xff0c;也是深度学习应用的主要驱动因素&#xff0c;如&#xff1a; 视觉检查&#xff1a;在制造过程中识别零部…

spring security 艰苦学习中

一、初次感知 1.jwt工具类 密钥secret 有点意思。 2.PasswordEncoder 对密码进行加密&#xff0c;在配置类中返回bean. 下面这个关于加密和解密的东西是有误导性的。

231129 刷题日报

本周值班第3天&#xff0c;今天终于收到二面电话&#xff0c;一度以为挂了。。加油卷&#xff01; 今天尊重下艾宾浩斯遗忘曲线&#xff0c;重复下前几天看的01背包&#xff0c;子集背包&#xff0c;完全背包。 416. 分割等和子集 518. 零钱兑换 II 38min做了一道新题&#…

Aruba无线控制器新增加AP

1、将网线连接上AP的Eth端口&#xff0c;console线也连接上console口 2、在console后台可以看到AP获取到的IP地址 3、确认网络可以联通&#xff0c;通过https访问web界面 AP205默认账号密码&#xff1a;admin AP505账号为admin&#xff0c;密码为设备SN 4、右上角点击"维…