繁体   English   中英

错误:在预期的情况下没有抛出异常

[英]Error : no exception was thrown when one is expected

我创建了一个异常:OutOfRangeException

char& Chaine::operator[](int index){

    try{
        if((index < 0)){
            throw OutOfRangeException();
        }
    }
    catch(const Chaine::OutOfRangeException &e){
        cerr<<"Erreur"<<endl;   
    }

    return tab[index];
}

当我想测试它时:

TEST_CASE("exceptions") {
  Chaine s(10);

  REQUIRE_THROWS_AS( s[-1] == 0, Chaine::OutOfRangeException);

}

它给了我一个错误,上面写着:在预期的情况下没有抛出异常。 这怎么可能?

您要求测试用例测试在执行表达式s[-1] == 0时是否可以抛出Chaine::OutOfRangeException类型的异常。

确实使用throw OutOfRangeException(); ,但是您使用catch(const Chaine::OutOfRangeException &e)operator[]本身中捕获它。

因此,这个throw永远不会到达s[-1] == 0语句之外,测试也看不到它。

如果您希望异常到达它被抛出的函数的外部,请删除try / catch块或重新抛出异常:

catch(const Chaine::OutOfRangeException &e){
    cerr<<"Erreur"<<endl;
    throw; 
}

我会选择前者,因为我认为操作员不应该负责将错误通知用户。 函数的调用者可以自己决定在捕获到异常时是否要打印错误消息。 或者,如果他们没有在任何地方捕捉到异常,程序将终止并在OutOfRangeException对象中包含一条错误消息。

即使运算符重载负责打印到cerr ,它也可以简单地在if中这样做,它不需要捕获并重新抛出异常:

char& Chaine::operator[](int index){

    if(index < 0){
        cerr<<"Erreur"<<endl;   
        throw OutOfRangeException(); 
    }

    return tab[index];
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM