1 异常
一句话概括:捕获异常
1.1 谁捕获异常?捕获谁?
A捕获B
A()
{
try{
B();
}
}
1.1 谁制造了异常?
函数B
B()
{
throw 某个对象
}
1.1 捕获后怎么处理?
随A怎么做
A()
{
try{
B();
}catch(类型 对象)
{
//处理
}
}
2 函数B可能抛出多种异常
函数A中可有多个catch分支;
catch分支中,对于异常对象,先捕获派生类对象,再捕获基类对象,按此顺序排放代码;
未能捕获的异常,将继续抛给上一层的调用者
3 想知道函数B会抛出什么异常
3.1 函数B可以申明异常
void B(void) throw(int ,double,MyException) //可以抛出一个类
void B(void) throw()//不会抛出任何异常
void B(void) throw(...)//可以抛出任何异常
3.2 如果抛出了意外的异常怎么办
3.2.1事先设置处理函数
#include <iostream>
#include <stdlib.h>
using namespace std;
class MyException {
public:
virtual void what(void) { cout<<"This is MyException"<<endl;}
};
class MySubException : public MyException{
void what(void) {cout<<"This is MySubException"<<endl;}
};
void C(int i) throw(int, double)
{
int a = 1;
double b = 1.2;
float c = 1.3;
if(i == 0)
{
cout<<"In c,it is ok"<<endl;
}
else if (i == 1)
throw a;
else if (i == 2)
throw b;
else if (i == 3)
throw c;
else if (i == 4)
throw MyException();
else if (i == 5)
throw MySubException();
}
void B(int i)
{
cout<<"call C ..."<<endl;
C(i);
cout<<"after call C ..."<<endl;
}
void A(int i)
{
try {
B(i);
} catch (int j)
{
cout<<"catch int exception "<<j<<endl;
} catch (MyException &e)
{
e.what();
}
catch (...)
{
//捕捉其他被声明的异常
cout<<"catch other exception"<<endl;
}
}
void my_unexpected_func () { cout<<"catch unexpected exception"<<endl; }
int main(int argc, char **argv)
{
set_unexpected (my_unexpected_func);
int i;
if(argc != 2)
{
cout<<"Usage: "<<endl;
cout<<argv[0]<<" <0|1|2|3>"<<endl;
return -1;
}
i = strtoul(argv[1], NULL, 0);
A(i);
return 0;
}
3.2.2 对于意料之外的异常,会执行2个函数
"unexpected"函数(可以自己提供)未申明的异常时会调用
"terminate"函数(可以自己提供)用来处理catch分支未捕捉的异常
定义
void my_unexpected_func () { cout<<"catch unexpected exception"<<endl; }
void my_terminate_func() {cout<<"my_terminate_func"<<endl;}
调用
set_unexpected (my_unexpected_func);
set_terminate (my_terminate_func);