我创建了一个异常: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);
}
这给了我一个错误,它说:预期会发生任何异常。 这怎么可能?
答案 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];
}