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

ere*_*eOn 47 c++ exception throw

这些天,我一直在阅读很多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();
  }
}
Run Code Online (Sandbox Code Playgroud)

困扰我的是单一throw;陈述:如果你考虑给定的例子然后肯定,它显然是做什么的:它重新抛出首先陷入的异常f()并再次处理它.

但是,如果我handleException()直接调用它,而不是从一个catch()条款中做到这一点怎么办?有没有指定的行为?

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

谢谢.

Ala*_*kes 47

如果你throw;自己做了一个,并且没有重新抛出的当前例外,那么程序会突然结束.(更具体地说,terminate()被称为.)

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

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

  • 是 - `throw e;`使用静态类型e抛出一个新的异常,而不是动态类型 - 因此如果e是多态的,它可以进行切片. (12认同)
  • @ereOn:我相信至少有一个区别是`throw;`将保留原始异常类型,而`throw e;`可能会切片. (2认同)

dal*_*lle 38

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

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

  • 我希望我也可以接受这个答案:我接受了艾伦·斯托克斯(Alan Stokes)的回答,因为他目前的声誉比您低。他还提供了详细而准确的答案。为公平起见推荐了此版本。非常感谢你。 (3认同)

sha*_*oth 7

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