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
吗?
什么都不可能扔掉.你需要抛出一些东西.虽然您可能已经看到人们在throw
没有任何内容的情况下使用关键字,但这只意味着他们会重新抛出当前处理的异常.
这不是您问题的直接答案,而是个人推荐.
您可能希望查看预定义的异常,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)