如果出现问题,可以从构造函数中调用throw;
,并且您不知道如何恢复?
这个想法是让应用程序崩溃,因为状态未知。或者你应该总是指定一个参数吗?
从MSDN我只发现如果没有参数它会重新抛出,但不知道如果没有重新抛出的初始异常会发生什么。
答案 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()
,它需要较少的认知努力来识别正在发生的事情。