C 是可能的
Is is possible in C++ to throw nothing?
在特殊情况下,我希望我的程序停止处理,向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投掷例外:
- 用操作数评估掷出表达式抛出异常(15.1(
- 一个没有操作数的投掷表达,重新授予当前处理的异常(15.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抛出异常[除外]
- 抛出异常复制定位化(8.5,12.8(一个临时对象,称为异常对象。该临时是一个LVALUE,用于初始化匹配处理程序中声明的变量(15.3(。
因此,您必须传递能够初始化的东西,从定义上讲,这些内容并非一无所有。
为了确保完整的清理工作,您必须抛出异常并将其捕获在>的某个地方。当异常但未捕获异常时,不需要实现来清理堆栈对象。要求(在[[excep.Handle]/9(抛出但未捕获的例外是该程序调用std::terminate()
,并且实现了是否清理了堆栈对象。
- 没有找到相关文章