【C++】异常处理 ② ( 异常捕获类型 | 异常捕获机制 - 严格匹配异常类型 | 未知异常捕获 - 不知道异常类型 )

2023-12-01 09:35:47 浏览数 (2)

一、异常捕获机制 - 严格匹配异常类型

1、异常捕获机制 - 严格匹配异常类型

异常机制 与 函数机制 是 互不干涉的两个系统 ,

  • 函数参数 的 匹配机制 是 形参 与 实参 进行匹配 ,
  • 异常捕获 的 匹配机制 是 基于 抛出的异常类型进行匹配 ;

注意 区分 异常捕获 与 函数参数匹配 , 异常捕获 匹配的是 抛出的异常类型 与 catch 分支中要捕获的异常类型 ;

异常捕获 , 严格按照类型进行匹配 ,

  • 如 : 在 catch 分支 中 捕获 short / int 类型的异常 , 是无法拦截到 char 类型异常的 ;

2、代码示例 - 异常捕获严格匹配异常类型

代码示例 :

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

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

int main() {

	// 2. 捕获并处理异常
	try
	{
		// 调用可能产生异常的函数
		fun(0);
	}
	// 抛出 char 类型的异常 , 捕获 int 类型异常是无法拦截到异常的
	// 此处程序会崩溃
	catch (int e)
	{
		cout << "捕获到异常 : " << e << endl;
	}

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

	return 0;
};

执行结果 :

0x75D5D8A2 处(位于 HelloWorld.exe 中)有未经处理的异常: Microsoft C 异常: char,位于内存位置 0x0077F73B 处。

二、异常捕获机制 - 未知异常捕获


1、未知异常捕获 - 不知道异常类型

上面的案例中 , 抛出了 char 类型的异常 ‘A’ , 在 catch 分支中拦截的是 int 类型的异常 ,

也就是 没有拦截到 抛出的 char 类型异常 , 该函数是 main 函数 , 已经是最顶层的函数 ,

main 函数中 , 如果出现异常没有处理 , 应用程序直接崩溃 ;

应对该问题的方法是 , 拦截 未知异常 类型的 异常 ,

要捕获未知类型的异常 , 可以 使用 catch ( … ) 分支 , 这个catch块可以匹配任何类型的异常 , 可以拦截所有类型的异常 ,

因此无论try块中抛出什么类型的异常,都会被这个catch块捕获并处理。

使用 catch ( … ) 分支 , 可以拦截所有类型的异常 , 相当于 Java 中的 Exception 异常父类 ;

下面的代码 , 可以捕获一切类型的异常 ;

代码语言:javascript复制
	// 捕获一切类型异常
	try
	{
	}
	catch ( ... )
	{
		cout << "捕获到未知类型异常 ... "<< endl;
	}

2、代码示例 - 未知异常捕获

代码示例 : 在下面的示例中 ,

  • 首先 , 使用 throw 关键字 抛出了一个 char 类型的异常 ;
  • catch (int e) 代码块中 , 可以捕获 int 类型异常 , 不能捕获 char 类型的异常 ;
  • 由于 catch 代码块 中没有明确捕获 char 类型的异常 , 该 抛出的 char 类型的异常 将被第 2 个catch ( … ) 块捕获 , 并打印相关信息 ;
代码语言:javascript复制
#include "iostream"
using namespace std;

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

int main() {

	// 2. 捕获并处理异常
	try
	{
		// 调用可能产生异常的函数
		fun(0);
	}
	// 抛出 char 类型的异常 , 捕获 int 类型异常是无法拦截到异常的
	// 此处程序会崩溃
	catch (int e)
	{
		cout << "捕获到异常 : " << e << endl;
	}
	// 捕获一切未知类型的异常
	catch ( ... )
	{
		cout << "捕获到未知类型异常 ... "<< endl;
	}

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

	return 0;
};

执行结果 :

代码语言:javascript复制
捕获到未知类型异常 ...
Press any key to continue . . .

0 人点赞