异常是一种 特殊的程序流控制机制 , 用于处理程序中可能出现的错误或异常情况 ;
当程序执行错误时 , 由 throw 关键字抛出异常 , 并即跳转到相应的异常处理程序中 ; 如果没有适当的异常处理程序处理该异常 , 程序会崩溃终止 ;
异常与函数对比 :
异常是跨函数的 , 下图中 函数 f 调用 函数 g , 函数 g 调用 函数 h ;
在 函数 h 中抛出异常 , 异常会沿着函数 调用顺序 , 先抛给 函数 g , 如果 g 不处理 , 则继续向上抛给 函数 f ;
上述 异常处理 机制 , 可以在不同的函数中 进行 抛出异常 和 处理异常 的操作 ;
这样 函数设计开发时 只需要解决具体的问题 , 不需要过多考虑 异常处理 ;
抛出异常 语法 : 使用 throw 关键字 , 抛出异常对象 ;
throw 异常对象;
代码示例 : 在下面的函数中 , 抛出一个 int 类型的异常 ;
// 1. 在 函数 中 抛出异常
void fun(int a) {
if (a == 0) {
// 抛出一个 int 类型的异常
throw 2;
}
}
异常捕获 语法 : 在 try 代码块中执行 可能抛出异常的 代码 , 如果出现异常 , 就可以在 catch 分支中进行捕获 ;
try {
// 出现异常的代码块
} catch( 异常类型声明 )
代码示例 : 下面的代码中 , 捕获 try 代码块中产生的异常 ,
// 2. 捕获并处理异常
try
{
// 调用可能产生异常的函数
fun(0);
}
catch (int e)
{
cout << "捕获到异常 : " << e << endl;
}
catch ( ... )
{
// 捕获 ... 可以捕获未知其它类型的异常
cout << "捕获到未知类型异常"<< endl;
}
异常捕获流程 :
错误代码示例 : 在下面的代码中 , 没有捕获异常 , 则在执行时会报错 : " 0x755FF932 处(位于 HelloWorld.exe 中)有未经处理的异常 " ;
#include "iostream"
using namespace std;
// 1. 在 函数 中 抛出异常
void fun(int a) {
if (a == 0) {
// 抛出一个 int 类型的异常
throw 2;
}
}
int main() {
// 调用可能产生异常的函数
fun(0);
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
0x755FF932 处(位于 HelloWorld.exe 中)有未经处理的异常:
Microsoft C++ 异常: int,位于内存位置 0x00F6FB6C 处。
异常捕获完整代码示例 :
#include "iostream"
using namespace std;
// 1. 在 函数 中 抛出异常
void fun(int a) {
if (a == 0) {
// 抛出一个 int 类型的异常
throw 2;
}
}
int main() {
// 2. 捕获并处理异常
try
{
// 调用可能产生异常的函数
fun(0);
}
catch (int e)
{
cout << "捕获到异常 : " << e << endl;
}
catch ( ... )
{
// 捕获 ... 可以捕获未知其它类型的异常
cout << "捕获到未知类型异常"<< endl;
}
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
捕获到异常 : 2
请按任意键继续. . .
异常是跨函数的 , 异常会从本函数中抛给调用本函数的调用者 ( 调用函数 ) ;
在下面的示例中 , fun2 函数中捕获 fun 函数中的 异常未处理 , 抛到了 main 函数中 ;
main 函数中的异常必须处理 , 否则程序崩溃 ;
代码示例 :
#include "iostream"
using namespace std;
// 1. 在 函数 中 抛出异常
void fun(int a) {
if (a == 0) {
// 抛出一个 int 类型的异常
throw 2;
}
}
// 3. 捕获异常不处理 , 继续向上抛出
void fun2(int a) {
try
{
// 执行可能抛出异常的函数
fun(a);
}
catch (int e)
{
// 捕获到了异常, 但是不处理继续向上抛出
throw;
}
}
int main() {
// 2. 捕获并处理异常
try
{
// 调用可能产生异常的函数
//fun(0);
// 异常是跨函数的
// 调用可能产生异常的函数
// 该 fun2 函数中捕获 fun 函数中的 异常未处理
// 抛到了 main 函数中
fun2(0);
}
catch (int e)
{
cout << "捕获到异常 : " << e << endl;
}
catch ( ... )
{
// 捕获 ... 可以捕获未知其它类型的异常
cout << "捕获到未知类型异常"<< endl;
}
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
捕获到异常 : 2
请按任意键继续. . .