【问题标题】:What happens if I use "throw;" without an exception to throw?如果我使用“投掷”会发生什么?无一例外地抛出?
【发布时间】:2011-01-18 07:45:37
【问题描述】:

这是设置。

我有一个调用多个函数的 C++ 程序,所有这些函数都可能引发相同的异常集,并且我希望每个函数中的异常具有相同的行为 (例如,打印错误消息并将所有数据重置为异常 A 的默认值;只需打印异常 B;干净地关闭所有其他异常)。

似乎我应该能够设置 catch 行为来调用一个简单地重新抛出错误并执行捕获的私有函数,如下所示:

void aFunction()
{
    try{ /* do some stuff that might throw */ }
    catch(...){handle();}
}

void bFunction()
{
    try{ /* do some stuff that might throw */ }
    catch(...){handle();}
}

void handle()
{
    try{throw;}
    catch(anException)
    {
        // common code for both aFunction and bFunction
        // involving the exception they threw
    }
    catch(anotherException)
    {
        // common code for both aFunction and bFunction
        // involving the exception they threw
    }
    catch(...)
    {
        // common code for both aFunction and bFunction
        // involving the exception they threw
    }
}

现在,如果在异常类之外调用“handle”会发生什么。 我知道这永远不会发生,但我想知道 C++ 标准是否未定义该行为。

【问题讨论】:

  • 它被终止了,但是你想让我做什么?,给你一个编译器来执行这个程序,这样你就可以验证结果了。
  • 编译器所做的就是编译它。它会编译,因为句柄的 定义 并没有警告用户它肯定需要加载的异常。编译器不能告诉你关于未定义行为的有用信息,尤其是像这样直到运行时才会被拾取的东西。

标签: c++ exception refactoring


【解决方案1】:

如果在异常上下文之外调用handle(),您将throw 不处理异常。在这种情况下,标准(参见第 15.5.1 节)规定

如果当前没有处理异常,则执行没有操作数的 throw-expression 调用 terminate()

因此您的应用程序将终止。这可能不是你想要的。

【讨论】:

  • 好吧,如果您不在 catch 块内,则没有合理的理由调用“handle()”,但我对是否会定义发生的事情感兴趣。那是一个完美的答案。谢谢!
【解决方案2】:

如果你在 catch 块内使用 throw,它会重新抛出异常。如果您在 catch 块之外使用 throw,它将终止应用程序。

【讨论】:

    【解决方案3】:

    永远,永远,永远不要使用 catch(...),因为您可能会捕获您不想捕获的应用程序错误,例如错误、访问冲突(取决于您的编译方式)。

    阅读伟大的 John Robbins 书(调试 Windows 应用程序),他在其中更详细地解释了为什么不应该这样做。

    【讨论】:

    • 这与我的问题完全无关。此外,它是不准确的,如上所示的 SF。只要您正确处理它,就有很多非常好的理由使用 (...)。例如,假设我想释放共享的东西的锁。我可以等到它到达析构函数,但最好在确定不再需要它时立即执行。如果我想确保访问冲突和错误仍然导致终止,我可以从 catch(...){} 块内部重新抛出。
    猜你喜欢
    • 2010-11-02
    • 2011-02-24
    • 1970-01-01
    • 2019-04-27
    • 2017-04-07
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多