【问题标题】:What does a single "throw;" statement do?单次“投掷”是什么意思?声明吗?
【发布时间】:2011-07-19 17:14:21
【问题描述】:

这些天,我阅读了很多 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 的其他“奇怪”(可能不是好词)用法吗?

谢谢。

【问题讨论】:

  • 您是否在链接页面上阅读过此内容? parashift.com/c++-faq-lite/exceptions.html#faq-17.15 '在本例中,语句throw; 的意思是“重新抛出当前异常。”'
  • @Fred Larson:当然。但是在没有“当前”异常的情况下,会发生什么?
  • 我找到了答案,但@dalle 打败了我。

标签: c++ exception throw


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我希望我也能接受这个答案:我接受了 Alan Stokes 的回答,因为他目前的声誉低于你。他还提供了详细而准确的答案。为公平而赞成这一点。非常感谢。
    【解决方案3】:

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

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

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

    【讨论】:

    • 感谢您的回答。这可能是另一个问题的一部分,但肯定是相关的:你能解释一下调用“throw”之间的区别吗?和“扔 e;”在你最后的声明中?我不知道有什么区别。
    • @ereOn:我相信至少有一个区别是throw; 将保留原始异常类型,而throw e; 可能会切片。
    • @Fred Larson:我认为只有在按值捕获时才会发生切片。但你可能是对的(我完全不确定)。有没有人确认一下?
    • 是的——throw e; 抛出一个新的异常,静态类型为 e,而不是动态类型——所以如果 e 是多态的,它可以切片。
    • @NHDaly 是的。不会捕获任何其他异常(因此无论如何都不需要重新抛出)。但是好人不会扔不是来自std::exception的东西。
    猜你喜欢
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    相关资源
    最近更新 更多