1. 语法形式
before try code
try{
before throw;
throw expection;
after throw;
}catch(expection1){
}catch(expection2){
}catch(expection3){
}catch(...){
}
after try code
2. 逻辑
当try语句中执行代码时,通过throw抛出一个异常时
代码会跳到与catch之后的expection类型一致的第一个catch中的语句块里去执行(包括expection的基类)
如果找不到则返回调用该 try{}catch(){} 所在的函数中去寻找对应的catch语句,如果都找不到则直接调用系统报错函数
如果找到则执行相应的catch语句中的代码,执行之后直接执行最后一个catch之后的代码
3. 注意点
1)通过throw抛出异常之后,在throw所在的try语句块中throw之后的代码不会被执行
2)与catch语句中的类型进行匹配的时候是通过拷贝构造的方式进行传递、
3)匹配会将子类当成基类
4)catch(...)能够匹配任何类型,所以一般放在所有具体情况catch的最后
5)只执行第一个相符的catch
6)如果当前函数中没有找到对应的catch则会返回调用这个函数的函数中去寻找,直至main函数
7)如果一直找不到对应的catch语句,则直接调用系统的保存函数结束程序
8)如果找到对应的catch语句,则会继续执行该catch语句所在的 try{}catch(){}模块中最后的catch之后的代码
9)如果catch中还有throw,则会在更上一层的try{}catch(){}语句块中去寻找
10)throw最好在try{}catch(){}语句块中使用,要不可能会导致使用者逻辑错误
4. 执行流程图
5. 代码测试(每个注意点都可以进行测试,只给出一种如下代码所示)
#include <iostream>
using namespace std;
int testA()
{
try{
throw -1.0;
}catch(char a){
cout<<"In testA catch int:"<<a<<endl;
}catch(double b){
cout<<"In testA catch doubloe:"<<b<<endl;
throw 1.0;
}
cout<<__FUNCTION__<<endl;
}
int main()
{
cout << "Hello World!" << endl;
try{
testA();
}catch(int a){
cout<<"In Main catch int:"<<a<<endl;
}catch(double b){
cout<<"In Main catch doubloe:"<<b<<endl;
}
cout<<"after catch"<<endl;
return 0;
}
6. 代码输出