什么是单一的“抛出”;声明呢?

时间:2011-03-21 14:02:47

标签: c++ exception throw

这些天来,我一直在阅读C++ F.A.Q,特别是this page

通过阅读本节,我发现了一种“技术”,作者称之为“异常调度程序”,允许某人将所有异常处理分组到一个方便的函数中:

void handleException()
{
  try {
    throw; // ?!
  }
  catch (MyException& e) {
    //...code to handle MyException...
  }
  catch (YourException& e) {
    //...code to handle YourException...
  }
}

void f()
{
  try {
    //...something that might throw...
  }
  catch (...) {
    handleException();
  }
}

令我困扰的是单throw;语句:如果你考虑给定的例子然后肯定,它显然是做什么的:它重新抛出首先在f()中捕获的异常并再次处理它。

但是,如果我直接调用handleException(),而不是从catch()子句中进行调用,该怎么办?有没有指定的行为?

此外,对于奖励积分,您知道的throw还有其他“怪异”(可能不是好词)吗?

谢谢。

3 个答案:

答案 0 :(得分:45)

如果您自己执行throw;,并且没有重新抛出的当前异常,则程序突然结束。 (更具体地说,调用terminate()。)

注意扔;是重新抛出当前异常的唯一安全方法 - 它不等于

catch (exception const & e) { throw e; }

答案 1 :(得分:37)

是的,它指定了行为,它将调用terminate;

  

15.1,第8段:如果目前没有处理异常,则执行a   抛出没有操作数调用的表达式   terminate()(15.5.1)。

答案 2 :(得分:7)

那就是所谓的异常处理程序。如果有的话,它会重新抛出“当前异常”。如果当前没有处理任何异常terminate() will be called