问题:如何判断一个函数是否会抛出异常,以及抛出哪些异常?
c++提供语法用于声明函数所抛出的异常,异常声明作为函数声明的修饰符,写在参数列表后面
/* 可能抛出的任何异常*/
void func1();
/* 只能抛出的异常类型:char和int */
void func2()throw(char,int);
/* 不抛出任何异常 */
void func3() throw();
函数规格说明的意义:提示函数调用者必须做好异常处理的准备,提示函数的维护者不要抛出其他异常,异常规格说明是函数接口的一部分。
问题:如果抛出的异常不在声明列表中,回复发生什么?
#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;
}
函数抛出的异常不在规格说明中,全局unexpected()被调用,默认的unexpected()函数会调用全局的terminate()函数,可以自定义函数替换默认的unexpected()函数实现,注意:不是所有的c++编译器都支持这个标准行为。
unexpected()函数的替换:
自定义一个无返回值无参数的函数,能够再次抛出异常,当异常符合触发函数的异常规格说明时,恢复程序执行,否则,调用全局terminate()函数结束程序。
调用set_unexpexted()设置自定义的异常函数,参数类型为函数指针void(*)(),返回值为默认的unexpected()函数入口地址。
#include <iostream>
#include <cstdlib>
#include <exception>
using namespace std;
void my_unexpected()
{
cout << "void my_unexpected()" << endl;
// exit(1); 不退出,扔出一
throw 1; //兼容了触发函数的异常说明,程序正常执行,相当于func扔的为int
}
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;
}
编译器和编译器有差异,c++中的函数可以声明异常规格说明,异常规格说明可以看做接口的一部分,函数抛出的异常不在规格说明中,unexpected()被调用,unexpected()中能够再次抛出异常,异常能够匹配,恢复程序执行,否则,调用terminate()结束程序。