一、异常捕获机制 - 严格匹配异常类型
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 ( … ) 块捕获 , 并打印相关信息 ;
#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 . . .