[英]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.