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