首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:未抛出异常,但应抛出异常

错误:未抛出异常,但应抛出异常
EN

Stack Overflow用户
提问于 2019-11-30 05:48:32
回答 1查看 173关注 0票数 0

我已经创建了一个异常:OutOfRangeException

代码语言:javascript
复制
char& Chaine::operator[](int index){

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

    return tab[index];
}

当我想测试它的时候:

代码语言:javascript
复制
TEST_CASE("exceptions") {
  Chaine s(10);

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

}

它给了我一个错误,它说:当一个异常被抛出时,没有抛出异常。这怎么可能呢?

EN

回答 1

Stack Overflow用户

发布于 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块或重新抛出异常:

代码语言:javascript
复制
catch(const Chaine::OutOfRangeException &e){
    cerr<<"Erreur"<<endl;
    throw; 
}

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

即使操作符重载负责打印到cerr,它也可以简单地在if中执行此操作,它不需要捕获并重新抛出异常:

代码语言:javascript
复制
char& Chaine::operator[](int index){

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

    return tab[index];
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59111304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档