我已经创建了一个异常: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);
}它给了我一个错误,它说:当一个异常被抛出时,没有抛出异常。这怎么可能呢?
发布于 2019-11-30 05:58:57
您要求测试用例测试在执行表达式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];
}https://stackoverflow.com/questions/59111304
复制相似问题