错误:预期发生异常时不会引发异常

时间:2019-11-29 21:48:32

标签: c++ exception

我创建了一个异常: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);

}

这给了我一个错误,它说:预期会发生任何异常。 这怎么可能?

1 个答案:

答案 0 :(得分:1)

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

确实使用throw OutOfRangeException();抛出了该类型的异常,但是您却使用operator[]将其捕获在catch(const Chaine::OutOfRangeException &e)本身中。

因此,此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];
}
相关问题