我有一个(类成员)函数,我希望避免应用程序崩溃,因为含糊不清。为此,我添加了一个try catch bock,如下所示:
void getGene(unsigned int position){
T val;
try {
val = _genome.at(_isCircular ? position % _genome.size() : position);
}
catch (std::exception& e) {
std::cerr << "Error in [" << __PRETTY_FUNCTION__ << "]: "
<< e.what() << std::endl;
exit(1);
}
return val;
}现在,我想添加一个Boost单元测试,我想做这样的事情
BOOST_AUTO_TEST_CASE(nonCircularGenome_test){
// set size to 10
test.setSize(10);
// set non circular
test.setNonCircular();
// gene at site # 12 does not exist in a 10-site long genome, must throw an exception
BOOST_CHECK_THROW(test.getGene(12), std::out_of_range);问题是,我不能让这两件事都起作用。在发布设置中,试捕捉块工作得很好。但是,只有当我移除try-catch块并让函数抛出异常时,此测试才能工作。
怎样才能使这两件事都正常工作,这样用户就会在执行过程中得到正确的错误提示,而测试在调试时会显式地检查?一种方法是使用#ifdef/#endif 调试块,但我希望避免使用预处理器宏。
提前谢谢你,
尼基尔
发布于 2013-06-17 16:18:07
您似乎误解了异常的范围和目的--也许也误解了一般的错误处理。
首先,您应该定义函数的前提条件:getGene()总是期望position是有效的吗?它是否期望它的客户永远不会提供无效的职位?
如果是这样的话,提供无效位置的客户端(即使客户端是测试例程)正在违反与getGene()的合同(特别是,它正在打破它的预条件),并且从定义上来说,违约是未定义的行为。不能测试未定义的行为,因此应该删除测试。
另一方面,如果您的函数具有广泛的契约,即它允许客户端传递任何位置(甚至无效的位置)和(a)抛出异常或(b)返回错误代码以在该位置无效时通信失败,则exit(1)行不应该在那里,因为您要退出程序并将控制传输回调用方。
一种可能是在记录诊断之后重新抛出异常:
T getGene(unsigned int position){
T val;
try {
val = _genome.at(_isCircular ? position % _genome.size() : position);
}
catch (std::exception& e) {
std::cerr << "Error in [" << __PRETTY_FUNCTION__ << "]: "
<< e.what() << std::endl;
throw;
// ^^^^^
}
return val;
}如果您不需要打印诊断,只需让异常自然传播:
T getGene(unsigned int position){
return _genome.at(_isCircular ? position % _genome.size() : position);
}https://stackoverflow.com/questions/17152084
复制相似问题