1、问题
如何判断一个函数是否会抛出异常,以及抛出那些异常?
2、 函数的异常规格说明
- C++提供语法用于声明函数所抛出的异常
- 异常声明作为函数声明的修饰符,写在参数列表后面
- 异常规格说明的意义
— 提示函数调用者必须做好异常处理的准备
— 提示函数维护者不要抛出其他异常
— 异常规格说明是函数接口的一部分
3、问题
如果抛出的异常不在声明的列表中,会发生什么?
- 下面的代码输出什么?
#include <iostream>
#include <string>
using namespace std;
void func()throw(int)
{
cout << "void func()" << endl;
throw 'c';
}
int main()
{
try
{
func();
}
catch (int)
{
cout << "catch (int)" << endl;
}
catch (char)
{
cout << "catch (char)" << endl;
}
return 0;
}
4、函数的异常规格说明
- 函数抛出的异常不在规格说明中,全局
unexpected()
被调用 - 默认的
unexpected()
函数会调用全局的terminate()
函数 - 可以自定义函数替换默认的
unexpected()
- 注意:不是所有的C++编译器都支持这个标准行为
5、unexpected()
函数的替换
— 自定义一个无返回值无参数的函数
- 能够再次抛出异常
1、当异常符合触发函数的异常规格说明时,恢复程序执行
2、否则,调用全局terminate()
函数结束程序 - 调用
set_unexpected()
设置自定义异常函数
1、参数类型为void(*)()
2、返回值为默认的unexpected()
函数入口地址
#include <iostream>
#include <string>
#include <exception>
using namespace std;
void my_unexpected()
{
cout << "void my_unexpected()" << endl;
exit(1);
}
void func()throw(int)
{
cout << "void func()" << endl;
throw 'c';
}
int main()
{
set_unexpected(my_unexpected);
try
{
func();
}
catch (int)
{
cout << "catch (int)" << endl;
}
catch (char)
{
cout << "catch (char)" << endl;
}
return 0;
}
小结:
- C++中的函数可以声明异常规格说明
- 异常规格说明可以看作接口的一部分
- 函数抛出的异常不在规则说明中,
unexpected()
被调用 unexpected()
中能够再次抛出异常
— 异常能够匹配,恢复程序的进行
— 否则,调用terminate()
结束程序
#include <iostream>
#include "exception"
using namespace std;
void my_unexpected()
{
cout << "void my_unexpected()" << endl;
throw 1;
exit(1);
}
void func()throw(int)
{
cout << "void func()throw(int)" << endl;
throw 'c';
}
int main()
{
set_unexpected(my_unexpected);
try
{
func();
}
catch (int i)
{
cout << "catch (int i)" << endl;
}
catch (char c)
{
cout << "catch (char c) " << endl;
}
return 0;
}