【问题标题】:std::future no_state exception vs assertionstd::future no_state 异常与断言
【发布时间】:2017-06-02 16:47:55
【问题描述】:

按照我的理解,asserts 应该用于检查不应该发生的编程错误和文档条件,异常应该用于程序员无法控制的运行时错误(例如,获取key_not_found来自数据库的响应)

那么为什么std::future_errc::no_state 是一个东西?只有当访问没有有效状态的未来时,才能抛出具有该值的异常。这是程序员可以控制的。为什么不鼓励实现从失败的断言中止或在发生这种情况时中止呢?是否存在用户可以从无状态异常中恢复的情况?

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

【问题讨论】:

    标签: c++ c++11 exception future assert


    【解决方案1】:

    assertions主要是一种调试/开发时的功能。在编译发布版本的代码时,它们通常会被忽略。因此,虽然它们很高兴拥有并且可以在您开发代码时记录不变量和其他内容(并帮助您捕获错误),但您不能依赖它们始终启用。 另一方面,std::future_errc::no_state 只是一个调试的东西,并且将永远存在(当然,除非你是那些在禁用异常(和 rtti)的情况下构建的人之一 - 但在这种情况下我没有什么可提供的,也没有同情心)。

    【讨论】:

    • 但是标准不要求抛出异常。在这种情况下,为什么不直接推荐库中止(不会受到调试版本的影响)而不是抛出?
    • @Curious “但标准不要求抛出异常” - 您需要向标准委员会询问为什么会这样的问题。
    • 这不是问题。至于我为什么要问。我只是想了解为什么首先决定有这个例外。如果有一个实际的地方我应该尝试在我的代码中捕获这个异常,那么我想这样做。
    • @Curious,除了委员会成员之外,还有谁能够回答为什么做出这个决定?
    • 我想补充一点,std::future_error 是一个std::logic_error,它代表程序员的逻辑错误。这就是您所描述的assert 的用途。 std::logic_error 本质上是报告断言失败的标准库方式。这也是许多开发人员避免抓住它们的原因。
    猜你喜欢
    • 1970-01-01
    • 2010-09-29
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2023-03-15
    • 2011-08-06
    相关资源
    最近更新 更多