首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用boost.Test尝试catch块

使用boost.Test尝试catch块
EN

Stack Overflow用户
提问于 2013-06-17 16:10:59
回答 1查看 1.1K关注 0票数 3

我有一个(类成员)函数,我希望避免应用程序崩溃,因为含糊不清。为此,我添加了一个try catch bock,如下所示:

代码语言:javascript
复制
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单元测试,我想做这样的事情

代码语言:javascript
复制
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 调试块,但我希望避免使用预处理器宏。

提前谢谢你,

尼基尔

EN

回答 1

Stack Overflow用户

发布于 2013-06-17 16:18:07

您似乎误解了异常的范围和目的--也许也误解了一般的错误处理。

首先,您应该定义函数的前提条件:getGene()总是期望position是有效的吗?它是否期望它的客户永远不会提供无效的职位?

如果是这样的话,提供无效位置的客户端(即使客户端是测试例程)正在违反与getGene()的合同(特别是,它正在打破它的预条件),并且从定义上来说,违约是未定义的行为。不能测试未定义的行为,因此应该删除测试。

另一方面,如果您的函数具有广泛的契约,即它允许客户端传递任何位置(甚至无效的位置)和(a)抛出异常或(b)返回错误代码以在该位置无效时通信失败,则exit(1)行不应该在那里,因为您要退出程序并将控制传输回调用方。

一种可能是在记录诊断之后重新抛出异常:

代码语言:javascript
复制
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;
}

如果您不需要打印诊断,只需让异常自然传播:

代码语言:javascript
复制
T getGene(unsigned int position){
    return _genome.at(_isCircular ? position % _genome.size() : position);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17152084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档