考虑一下:
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)当
~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
吗?如果不是,这是一种法律情况,在这种情况下,我们可以同时有两个异常(exception),我们在哪里划清界限? 最佳答案
不同的侧重点:
thrower()
是一个通过异常退出但不被异常处理机制调用的用户函数;它由另一个用户函数( Catcher
的析构函数)调用,该函数本身由异常处理机制调用,并且此函数不会通过异常退出。
关于c++ - 在放松过程中 throw ——为什么这个例子有效?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7319810/