异常机制 与 函数机制 是 互不干涉的两个系统 ,
注意 区分 异常捕获 与 函数参数匹配 , 异常捕获 匹配的是 抛出的异常类型 与 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;
}
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
0x75D5D8A2 处(位于 HelloWorld.exe 中)有未经处理的异常: Microsoft C++ 异常: char,位于内存位置 0x0077F73B 处。
上面的案例中 , 抛出了 char 类型的异常 ‘A’ , 在 catch 分支中拦截的是 int 类型的异常 ,
也就是 没有拦截到 抛出的 char 类型异常 , 该函数是 main 函数 , 已经是最顶层的函数 ,
main 函数中 , 如果出现异常没有处理 , 应用程序直接崩溃 ;
应对该问题的方法是 , 拦截 未知异常 类型的 异常 ,
要捕获未知类型的异常 , 可以 使用 catch ( … ) 分支 , 这个catch块可以匹配任何类型的异常 , 可以拦截所有类型的异常 ,
因此无论try块中抛出什么类型的异常,都会被这个catch块捕获并处理。
使用 catch ( … ) 分支 , 可以拦截所有类型的异常 , 相当于 Java 中的 Exception 异常父类 ;
下面的代码 , 可以捕获一切类型的异常 ;
// 捕获一切类型异常
try
{
}
catch ( ... )
{
cout << "捕获到未知类型异常 ... "<< endl;
}
代码示例 : 在下面的示例中 ,
#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;
};
执行结果 :
捕获到未知类型异常 ...
Press any key to continue . . .