我应该使用assert来验证第三方功能吗?

时间:2017-05-21 20:16:32

标签: c++ error-handling

我使用一些第三方函数,它基于过滤器返回指定数量的对象:

//void GetObjects(std::vector<T>&, Filter, int /*objectsNumber*/)

GetObjects(vec, filter, 1);

if(vec.empty())
{
   throw ObjectNotFound();
}

assert(vec.size() == 1);

我应该像上面那样使用断言吗?这是一个典型的断言场景吗?

2 个答案:

答案 0 :(得分:1)

如何处理程序中的错误取决于您和程序性质。

在生产环境中,您通常会尝试不断言,因为这意味着您的应用程序会死亡。在其他情况下,执行程序的过程会意识到程序已经死亡,然后重新启动它。

如果它只是用于学习/培训,使用正确的信息断言是一种轻松快速地找到问题的好方法。

底线 - 它真的取决于你。这里没有对错。

如果你想断言,通常你只在不满足一些非常基本的不变量/条件时,当你的程序不知道如何从这一点开始时才这样做。

答案 1 :(得分:0)

嗯,assert()是一个允许对生产代码禁用检查代码的宏,因此确保外部函数符合接口契约,它是一个很好的自定义使用断言以确保满足功能规范。

无论如何,使用模拟实例和一些单元测试框架将为您提供更好的结果,因为它允许您确保接口合同更精细地暴露于外部错误。我建议你两者,并很高兴看到这些想法在这些环境中传播:)