借助指南支持库和gsl_Expects
C++ 等实用程序,暂时实现了合约(有计划在未来将这些东西融入语言中)。使用此功能并根据您的项目设置,可能会违反合同:
- 抛出异常或
- 呼叫终止
我想知道恢复策略应该是什么。显然在第二种情况下(您设置违反合同以调用终止)没有,但即使在第一种情况下也很难恢复;由于异常是某种内部类型(例如,fail_fast
源自logic_error
旨在供人类读者进行事后分析)。
因此,鉴于所有这些,我的问题是:您是否打算从违反合同的情况中恢复过来?如果是怎么办?有没有描述如何做到这一点的来源?如果不是,将我的错误检查+处理与合同检查分开,只考虑硬错误方面的合同是个好主意吗?
我想第二个选择是我倾向于的,但令人讨厌的是,这些违规行为会导致我的整个程序崩溃,而不是取消单个函数。
我可以像这样构建合同轴承功能:
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)
}
但感觉它超出了使用合同的目的。