【发布时间】:2011-11-11 07:10:39
【问题描述】:
考虑一下:
void thrower () {
throw "123";
}
struct Catcher {
~ Catcher () {
try {thrower ();}
catch (...) {}
}
};
int main () {
try {
Catcher c;
throw 1.23;
}
catch (...) {}
}
在 gcc 4.3 上无需调用 terminate 即可编译和运行,但 according to the standard (15.5.1)
...当异常处理机制在完成对要抛出的表达式的评估之后但在捕获异常之前 (15.1),调用通过未捕获异常退出的用户函数...应调用终止。
当~Catcher 在 double 被抛出后被调用时,这是“在完成评估之后......在异常被捕获之前”,thrower 是“一个通过未捕获的异常退出的用户函数”,这满足上述条件。是的,char* 被捕获,但仅在 用户函数退出之后。
不应该调用terminate 吗?
强调这一点:
void do_throw () {
throw "123";
}
void thrower () {
do_throw ();
// Uncaught exception here (A)
}
struct Catcher {
~ Catcher () {
try {thrower (); /* (B) */}
catch (...) {}
}
};
int main () {
try {
Catcher c;
throw 1.23;
}
catch (...) {}
}
(A) 发生在 (B) 的上下文中,它已经有一个异常在进行中。
那么,terminate 不应该被调用吗?如果不是,而且在这种情况下,我们可以同时有两个例外,那么我们在哪里划清界限?
【问题讨论】:
标签: c++ exception gcc terminate