53

这些天来,我阅读了很多C++ FAQ,尤其是这个页面

通读该部分,我发现了一种作者称之为“异常调度器”的“技术”,它允许某人将他所有的异常处理分组到一个方便的函数中:

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您知道的“奇怪”(可能不是好词)用法吗?

谢谢你。

4

3 回答 3

52

如果您自己执行 a throw;,并且当前没有异常可以重新抛出,那么程序会突然结束。(更具体地说,terminate()称为。)

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

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

于 2011-03-21T14:07:56.973 回答
41

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

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

于 2011-03-21T14:06:35.320 回答
8

这就是所谓的异常处理程序。如果有的话,它会重新抛出“当前异常”。如果当前正在处理的没有异常terminate()将被调用

于 2011-03-21T14:05:45.943 回答