C++学习进阶:异常

本文详细介绍了C++中的异常处理机制,包括抛出异常、捕获异常的规则,异常安全和重新抛出的应用,noexcept关键字的作用,以及异常的优点和缺点。通过实例展示了如何在实际项目中管理和利用异常来提高代码的健壮性和性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.异常处理机制

1.1.抛异常和捕获异常

1.1.1.异常机制的基本场景

1.1.2.函数调用中异常栈展开的匹配规则:

1.2.异常机制的实际应用场景 

2.异常相关知识

2.1.异常安全和异常重新抛出

2.2.noexcept关键字

2.3.异常的优缺点 


1.异常处理机制

我们在C语言的学习中,了解了C语言的错误处理机制是通过终止程序和返回错误码这两种形式。 

而对于C++,是通过使用“异常”这一种错误处理机制,它允许程序在运行时遇到错误时,能够以一种结构化和可预测的方式进行处理。异常处理机制包括:抛出异常(throw)、捕获异常(catch)

1.1.抛异常和捕获异常

抛出异常

当程序遇到无法处理的错误时,可以使用throw关键字抛出一个异常。抛出异常时,可以传递一个值,这个值可以是任何类型的对象,包括基本数据类型和自定义类型。

捕获异常

catch块用于捕获异常。当异常被抛出时,控制流会立即离开当前函数(或代码块),并寻找能够处理该异常的catch块。一旦找到匹配的catch块,异常的值就会被传递给该块,并且该块中的代码会被执行。

1.1.1.异常机制的基本场景

抛出异常需要和捕获异常成对出现,接下来我们用数组越界的场景来学习异常机制!

#include<iostream>
#include<windows.h>
using namespace std;

int Exception(int i)
{

	int arr[5] = { 0, 1, 2, 3, 4 };
	if (i >=5)
	{
		throw "数组越界";
	}
	else
	{
		return arr[i];
	}
}
void Print()
{
	int i = 0;
    cout<<"需要打印下标为几的数组内容<<endl;
	cin >> i;
	cout << Exception(i) << endl;
}
int main()
{
    while(1)
    {
        sleep(2000);
        // try catch模块捕捉异常
	    // 异常一定要被捕获,不然会退出
	    try
	    {
	    	Print();
	    }
	    catch (const char* s)
	    {
	        cout << s << endl;
	    }
	    // 进入该区域表示 有人没有按照规范抛异常
	    // 可以捕获任意类型的内容
	    catch (...)
	    {
	    	cout << "未知异常" << endl;
	    }
    }
}

 这个就是异常最基本的一个场景,这里我们需要注意:

  1. 抛出异常后需要有接收异常的模块,不然会造成程序崩溃
  2. 抛出异常的类型需要和接收异常的类型一致,因为异常是通过抛出对象引发的,所以我们需要进行类型的匹配,传回匹配的异常信息
  3. 我们需要用catch(...)来作为没有按照规范的异常的保险,防止程序崩溃

当我们修改一下,抛异常的代码,改为抛出string对象。(注意catch处需要重载一个string类型)

int Exception(int i)
{
	int arr[5] = { 0, 1, 2, 3, 4 };
	if (i >=5)
	{
		string s = "数组越界";
		throw s;
	}
	else
	{
		return arr[i];
	}
}

这时我们抛出的对象的生命周期当前的Exception。catch接收时需要生成一个拷贝对象,这个对象在接收成功后销毁。我们可以使用右值引用语法来实现移动构造!(类似函数传值返回)


1.1.2.函数调用中异常栈展开的匹配规则:

  1. 首先检查throw是否在try内部࿰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值