目录
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;
}
}
}
这个就是异常最基本的一个场景,这里我们需要注意:
- 抛出异常后需要有接收异常的模块,不然会造成程序崩溃
- 抛出异常的类型需要和接收异常的类型一致,因为异常是通过抛出对象引发的,所以我们需要进行类型的匹配,传回匹配的异常信息
- 我们需要用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.函数调用中异常栈展开的匹配规则:
- 首先检查throw是否在try内部