前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 )

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

作者头像
韩曙亮
发布2023-11-30 09:30:05
3270
发布2023-11-30 09:30:05
举报
文章被收录于专栏:韩曙亮的移动开发专栏

一、异常处理

1、异常概念引入

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

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

异常与函数对比 :

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

异常是跨函数的 , 下图中 函数 f 调用 函数 g , 函数 g 调用 函数 h ;

在这里插入图片描述
在这里插入图片描述

在 函数 h 中抛出异常 , 异常会沿着函数 调用顺序 , 先抛给 函数 g , 如果 g 不处理 , 则继续向上抛给 函数 f ;

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

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

2、抛出异常语法

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

代码语言:javascript
复制
throw 异常对象;

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

代码语言:javascript
复制
// 1. 在 函数 中 抛出异常
void fun(int a) {
	if (a == 0) {
		// 抛出一个 int 类型的异常
		throw 2;
	}
}

3、捕获异常语法

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

代码语言:javascript
复制
try {
	// 出现异常的代码块
} catch( 异常类型声明 )

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

  • 如果捕获到 int 类型的异常 , 则执行 catch (int e) 分支中的代码 ,
  • 如果捕获到其它类型的异常 , 则执行 catch ( … ) 分支中的代码 ;
代码语言:javascript
复制
	// 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 中)有未经处理的异常 " ;

代码语言:javascript
复制
#include "iostream"
using namespace std;

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

int main() {

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

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

	return 0;
};

执行结果 :

代码语言:javascript
复制
0x755FF932 处(位于 HelloWorld.exe 中)有未经处理的异常: 
Microsoft C++ 异常: int,位于内存位置 0x00F6FB6C 处。 
在这里插入图片描述
在这里插入图片描述

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

异常捕获完整代码示例 :

代码语言:javascript
复制
#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;
};

执行结果 :

代码语言:javascript
复制
捕获到异常 : 2
请按任意键继续. . .
在这里插入图片描述
在这里插入图片描述

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

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

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

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

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

代码示例 :

代码语言:javascript
复制
#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;
};

执行结果 :

代码语言:javascript
复制
捕获到异常 : 2
请按任意键继续. . .
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、异常处理
    • 1、异常概念引入
      • 2、抛出异常语法
        • 3、捕获异常语法
          • 4、异常捕获流程
          • 二、异常处理代码示例
            • 1、错误代码示例 - 抛出异常 / 不捕获异常
              • 2、正确代码示例 - 抛出异常 / 捕获异常
                • 3、正确代码示例 - 抛出异常 / 捕获异常不处理继续抛出异常
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档