考虑一下:

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/

10-13 21:44