Pau*_*cas 8 c++ exception-handling
这段代码:
#include <iostream>
#include <stdexcept>
using namespace std;
int throw_it() {
  throw range_error( "foo" );
}
int main() {
  try {
    throw throw_it();
  }
  catch ( exception const &e ) {
    cerr << e.what() << endl;
    return 0;
  }
}
foo运行时打印,但保证这样做吗?更具体地说,在将异常结果抛出到已定义的行为的过程中抛出异常?是抛出最近抛出的异常的行为(如上面的测试代码那样)?
供参考:
$ g++ --version
i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
Cap*_*ous 15
一次只能评估一个例外.从15.1/7开始
如果异常处理机制在完成对要抛出的表达式的评估之后但在捕获异常之前调用了一个通过异常退出的函数,则调用std :: terminate.
在您的示例std::terminate()中未调用,因为实际上只抛出了一个异常.当throw throw_it();到达,throw_it()首先计算这导致函数被调用之前的异常实际上抛出.由于该函数抛出异常而永远不会返回原始throw的永远不会到达.如果throw_it()没有抛出异常并返回一个整数值,那么将执行调用throw表达式.因此,foo保证打印您的示例.
但是如何从活动的处理程序中抛出新的异常呢?捕获异常时,它已被完全评估.当你抛出一个新的异常(而不是用"throw;"重新抛出)时,会破坏原始异常并开始评估新的异常.
从15.1/4开始
异常对象在异常的最后剩余活动处理程序退出之后通过除了重新抛出之外的任何方式退出或....
这满足了一次只能评估一个异常的规则.