Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::未来无状态异常与断言_C++_C++11_Exception_Future_Assert - Fatal编程技术网

C++ std::未来无状态异常与断言

C++ std::未来无状态异常与断言,c++,c++11,exception,future,assert,C++,C++11,Exception,Future,Assert,按照我的理解,asserts应该用于检查编程错误和不应该发生的文档条件,异常应该用于程序员无法控制的运行时错误(例如,从数据库获取key\u not\u found响应) 那么为什么std::future\u errc::no\u state是一件事呢?只有在访问不具有有效状态的future时,才能引发具有该值的异常。这是程序员可以控制的。为什么不鼓励实现从失败的断言中中止,或者在发生这种情况时中止?是否存在用户可以从无状态异常中恢复的情况 例如,如果它们返回一个未从调用std::promise

按照我的理解,
assert
s应该用于检查编程错误和不应该发生的文档条件,异常应该用于程序员无法控制的运行时错误(例如,从数据库获取
key\u not\u found
响应)

那么为什么
std::future\u errc::no\u state
是一件事呢?只有在访问不具有有效状态的future时,才能引发具有该值的异常。这是程序员可以控制的。为什么不鼓励实现从失败的断言中中止,或者在发生这种情况时中止?是否存在用户可以从无状态异常中恢复的情况


例如,如果它们返回一个未从调用
std::promise::get_future()
中提取的未来,那么它将没有任何有效状态。或者对未来调用两次
get()

assert
在您开发功能时,调试主要是一种调试。在编译代码的发布版本时,它们通常被忽略。因此,虽然它们很好,可以在开发代码时记录不变量和其他东西(并帮助您捕获bug),但您不能指望它们始终处于启用状态。
另一方面,
std::future_errc::no_state
不仅仅是一个调试的东西,而且永远都会在那里(当然,除非您是禁用异常(和rtti)的人之一,但在这种情况下,我没有什么可以提供的,也没有同情心)。

但是标准不要求抛出异常。在这种情况下,为什么不建议库中止(这将不受调试版本的影响)而不是抛出?@好奇“但标准不要求抛出异常”-您需要向标准委员会询问为什么如此。这不是问题。至于我为什么要问。我只是想理解为什么一开始就决定要有这个例外。如果在我的代码中有一个实际的地方我应该尝试捕捉这个异常,那么我想这样做。@好奇的是,除了委员会成员之外,还有谁能够回答为什么做出这个决定?我想补充一点,这是一个代表程序员的逻辑错误的错误。这就是您描述的
assert
的目的
std::logic_error
本质上是报告断言失败的标准库方法。这也是许多开发人员避免捕捉它们的原因。