C 是可能的

Is is possible in C++ to throw nothing?

本文关键字:      更新时间:2023-10-16

在特殊情况下,我希望我的程序停止处理,向std::cerr输出错误,清理和退出。

但是,调用exit()不会调用已构造的任何对象的所有损坏器。我想让攻击器称为良好,所以我将所有代码包裹在try-catch块中,类似的东西:

int main(int argc, char** argv){
    try {
        bool something_is_not_right = false;
        /* lots of variables declared here */
        /* some code that might set something_is_not_right to true goes here */
        if(something_is_not_right){
            std::cerr << "something is not right!!!" << std::endl;
            throw '';  // dummy unused variable for throwing.
        }
    }
    catch (...) {}
    return 0;
}

这样,我保证会破坏所有变量。但是我似乎找不到将C 送到throw的方法。throw;在C 中具有特殊的含义;什么都没扔。

有没有办法 throw没有?

no

不可能什么都没有。您需要扔东西。虽然您可能已经看到人们使用throw关键字,但这只是意味着他们正在重新投入当前处理的异常。

这不是您问题的直接答案,而是个人建议。

您可能想查看stdexcept的预定义例外,该例外几乎涵盖了程序中发生的任何特殊行为。在您的情况下,我会扔一个std::runtime_error。另外,只有抓住您所期望的东西,而不是 catch'em all 。如果您真的想捕获所有内容,请捕获std::exception(所有标准异常的基类(。

我认为处理未知例外的情况并没有真正的意义,唯一合乎逻辑的结果就是中止执行。

#include <iostream>
#include <stdexcept>
int main()
{
  try
  {
    bool something_is_not_right = true;
    if ( something_is_not_right )
      throw std::runtime_error("something is not right!!!");
  }
  catch (std::runtime_error& e)
  {
    std::cerr << e.what() << 'n';
    throw;
  }
}

您如何知道捕获的原因是您的错误或其他东西(不记忆总是一个好的(。如果检测到错误,则应在自定义异常中创建该错误的原因。然后,您可以分辨出检测到的错误与您没想到的东西之间的区别。这只是好习惯。

嗯,你可以",但没有什么。它终止。

5.17投掷例外:

  1. 用操作数评估掷出表达式抛出异常(15.1(
  2. 一个没有操作数的投掷表达,重新授予当前处理的异常(15.3(。
  3. 如果目前没有例外,请评估没有操作数的投掷表达std::terminate()

这是有效的:

int main () {
  throw;
  return 0;
}

使用的来源:http://www.open-std.org/jtc1/sc22/wg21/wg21/docs/papers/2014/n4296.pdf

但不会清理任何东西。清理失败时使用std::terminate

否则您必须使用操作数,然后本节变得相关:

15.1抛出异常[除外]

  1. 抛出异常复制定位化(8.5,12.8(一个临时对象,称为异常对象。该临时是一个LVALUE,用于初始化匹配处理程序中声明的变量(15.3(。

因此,您必须传递能够初始化的东西,从定义上讲,这些内容并非一无所有。

为了确保完整的清理工作,您必须抛出异常并将其捕获在>的某个地方。当异常但未捕获异常时,不需要实现来清理堆栈对象。要求(在[[excep.Handle]/9(抛出但未捕获的例外是该程序调用std::terminate(),并且实现了是否清理了堆栈对象。

相关文章:
  • 没有找到相关文章