抛出没有参数的失败信号

时间:2011-02-08 10:25:42

标签: c++

如果出现问题,可以从构造函数中调用throw;,并且您不知道如何恢复?

这个想法是让应用程序崩溃,因为状态未知。或者你应该总是指定一个参数吗?

从MSDN我只发现如果没有参数它会重新抛出,但不知道如果没有重新抛出的初始异常会发生什么。

6 个答案:

答案 0 :(得分:13)

如果当前没有处理任何异常,throw;会导致terminate() being called immediately,这将导致您的程序异常终止。这不是很方便 - 与投掷有意义的异常相比,您将获得更少的信息。您可能抛出一个有意义的异常,在顶层捕获它(如main()),编写一些诊断然后结束程序。

答案 1 :(得分:10)

没有。 throw;是一种重新抛出当前异常的特殊语法。只有在catch块(或从一个调用的代码)内继续传播异常才有意义。

只需使用:

#include <stdexcept>
...
throw std::runtime_error("some description");

甚至只是

throw "some description";

但是后者处理起来更加丑陋,而且通常不赞成。

答案 2 :(得分:2)

ASSERT可能会让您的生活更容易诊断出现了什么问题

答案 3 :(得分:2)

虽然从技术上讲你可以打电话,但它不会做你想做的事。

最简单的解决方案是致电throw std::runtime_exception("thrown from Foo");,同时提供一些有关正在发生的事情的反馈。

答案 4 :(得分:2)

当你说“不知道如何恢复”时,你的意思是我认为此时你不知道如何处理错误?

也许你没有得到例外的观点。您抛出信息:异常发生以及原因。然后将调用堆栈展开到可以处理它的位置。在代码中的那一点,我们知道如果可能的话,如何恢复。

答案 5 :(得分:1)

从技术上讲,你可以这样做,因为没有参数抛出而没有活动异常只需调用terminate(),默认情况下调用abort()。我更喜欢直接调用abort(),它需要较少的认知努力来识别正在发生的事情。