C++中有可能什么都不扔?

Ber*_*ard 5 c++ destructor exception throw

在特殊情况下,我希望我的程序停止处理,输出错误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 '\0';  // dummy unused variable for throwing.
        }
    }
    catch (...) {}
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以保证破坏所有变量.但我似乎无法找到让C++ throw无所作为的方法. throw;在C++中有特殊意义; 它什么都不扔.

有什么方法可以throw吗?

nvo*_*igt 9

没有

什么都不可能扔掉.你需要抛出一些东西.虽然您可能已经看到人们在throw没有任何内容的情况下使用关键字,但这只意味着他们会重新抛出当前处理的异常.

  • 如http://stackoverflow.com/a/43675980/2428220中所述,如果您尝试不抛出任何内容,它将进行编译,但将终止程序,而不会执行任何堆栈展开操作。 (2认同)

Hen*_*nke 6

这不是您问题的直接答案,而是个人推荐.

您可能希望查看预定义的异常,stdexcept其中几乎涵盖了程序中出现的任何异常行为.在你的情况下,我会抛出一个std::runtime_error.此外,只抓住你期望抛出的东西而不是抓住它们.如果你真的想要捕获所有内容,那么catch 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @Bernard啊,我明白了.是的,只处理你的期望和你所知道的.如果你不期望`std :: logic_error`而只是`std :: invalid_argument`,那么你只处理`std :: invalid_argument`并且不能处理`std :: logic_error`. (2认同)