c++ - 您是否打算从违反契约(Contract)中恢复过来?

标签 c++ cpp-core-guidelines guideline-support-library

使用指南支持库和实用程序,如 gsl_Expects C++ 暂时实现了契约(有计划在 future 将这些东西烘焙到语言中)。使用此功能并根据您的项目设置,可能会违反契约(Contract):

  • 抛出异常或
  • 调用终止

  • 我想知道恢复策略应该是什么。很明显,在第二种情况下(您设置契约(Contract)违规以调用终止),没有,但即使在第一种情况下也很难恢复;由于异常属于某种内部类型(例如 fail_fast 派生自 logic_error ),因此很难构建恢复策略:我应该捕获什么异常,在哪个级别,是否有有用的信息可以帮助我恢复(我认为 file+line 是为了让人类读者进行事后分析)。
    因此,鉴于所有这些,我的问题是:您是否打算从违反契约(Contract)中恢复过来?如果是如何? 有没有消息来源描述如何做到这一点?如果不是,将我的错误检查+处理与契约(Contract)检查分开并且只从硬错误的角度考虑契约(Contract)是个好主意吗?
    我想我倾向于第二种选择,但令人讨厌的是,这些违规行为会导致我的整个程序崩溃,而不是使单个函数无效。
    我可以像这样构建合约承载功能:
    std::optional<return_t> my_function(Arg arg)
    {
      std::optional<return_t> ret;
    
      try {
        gsl_Expects(...); // do contract checking 
        /* rest of function */
      } catch (fail_fast& e) {
        // report contract violation
      }
    
      return ret;  // Exceptions from contract violations are turned into empty optional
                   // Other exceptions are handled like before (locally or from the caller)
    }
    
    但感觉这超出了使用合约的目的。

    最佳答案

    您不打算从契约(Contract)错误中恢复过来。契约(Contract)错误是程序中的逻辑错误,换句话说,您的程序是错误的。没有什么可行的方法可以从中恢复,您能做的最好的事情就是杀死并重新启动发生故障的整个子系统,并希望这是一次罕见的故障。
    您可以预期的异常情况不应该由契约(Contract)处理,这就是异常机制的用途。

    关于c++ - 您是否打算从违反契约(Contract)中恢复过来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68437225/

    相关文章:

    c++ - fedora 20 上的 boost/lexical_cast

    c++ - `gsl::string_span`的目的是什么?

    c++ - 是否有合法的方式从 gsl::not_null<T> 转移?

    c++ - 检索自上次 n 秒以来设置标志的次数的有效方法

    基类对象的 C++ vector

    c++ - gsl::not_null<T*> 与 std::reference_wrapper<T> 与 T&

    c++ - Ensures() - 指南支持库

    c++ - 我应该在新的 C++ 项目中使用指南支持库 (GSL) 吗?

    c++ - 了解此 `const&` 特化的必要性

    c++ - 强制 OpenMP 不在每个线程中缓存大对象