大家好我所面临的一些困难是理解以下代码处理未捕获的异常,我对下面的例子有一些疑问。
1)只是想知道为什么输出是:“呼唤我的意外”和“抓住了坏的表达”而不是“呼唤我的意外”,“抓住了X”
2)throw(X,Y, bad_exception)
在'void f()'函数中的含义。
3)typedef void (*pfv)();
实际意味着什么
class X { };
class Y { };
class A { };
typedef void (*pfv)();
void my_terminate() {
cout << "Call to my_terminate" << endl;
abort();
}
void my_unexpected() {
cout << "Call to my_unexpected" << endl;
throw;
}
void f() throw(X,Y, bad_exception) {
throw A();
}
void g() throw(X,Y) {
throw A();
}
int main()
{
pfv old_term = set_terminate(my_terminate);
pfv old_unex = set_unexpected(my_unexpected);
try {
cout << "In first try block" << endl;
f();
}
catch(X) {
cout << "Caught X" << endl;
}
catch(Y) {
cout << "Caught Y" << endl;
}
catch (bad_exception& e1) {
cout << "Caught bad_exception" << endl;
}
catch (...) {
cout << "Caught some exception" << endl;
}
}
抱歉提出了多个问题,希望有人能够以外行的方式向我解释。谢谢,并欣赏..
答案 0 :(得分:2)
1)当您调用f
时,它会抛出一个异常,其类型(A
)不是其异常规范的一部分。这会导致调用已注册的意外处理程序,在本例中为my_unexpected
。这将打印“调用my_unexpected”,然后重新抛出原始异常(如上所述,其类型不属于f
的异常规范),这会导致bad_exception
被抛出(但仅限于因为bad_exception
是f
)的异常规范的一部分。然后将其记录在main
中,并打印“Caught bad_exception”。
2)这意味着“f
可能会抛出X
,Y
或bad_exception
,如果它尝试抛出任何其他内容,那么意外的处理程序将是称为”。
3)这意味着“pfv是指向不带参数且具有void返回类型的函数的指针的类型”。因此pfv old_term;
表示old_term
是一个这样的函数指针。
这是一个有用的链接,值得:
特别相关的位在底部,它表示(强调我的):
如果unexpected()没有抛出(或重新抛出)一个允许的对象 f()的异常规范,然后C ++运行时执行两个之一 事情:
- 如果f()的异常规范包含类std :: bad_exception,则unexpected()将抛出一个类型的对象 std :: bad_exception,C ++运行时将搜索另一个 处理f()的处理程序。
- 如果f()的异常规范不包含类std :: bad_exception,则调用函数terminate()。