1

在以下程序中:

int main(){

    std::cout<<"enter numbers to be divide"<<std::endl;
    int a,b,c;

    while(true){
        try{
            if(!(std::cin>>a>>b)){
                throw std::invalid_argument("please enter proper interger");
            }

            if(b==0){
                throw std::runtime_error("please enter enter nonzero divisor");
            }
            c=a/b;
            std::cout<<"quotient = "<<c<<std::endl;
        }
        catch(std::invalid_argument e){
            std::cout<<e.what()<<"\ntry again?enter y/n";
            char c;
            std::cin>>c;
            if(c=='n'||c=='N') break;
        }
        catch(std::runtime_error e){
            std::cout<<e.what()<<"\ntry again?enter y/n";
            char c;
            std::cin>>c;
            if(c=='n'||c=='N') break;
        }
    }
    return 0;
}

我正在使用两种异常。程序在抛出“runtime_error”异常时运行良好,但在遇到“invalid_argument”异常时进入无限循环。实际上cin>>c,catch-block 中的“”语句存在问题,但无法弄清楚为什么会这样。

4

2 回答 2

3

std::cin>>a>>b遇到非数字字符时,会发生两件相关的事情:

  • 冒犯的角色没有被消耗
  • 的失败位std::cin已设置。

后者会阻止所有进一步的读取std::cin成功。这包括你的invalid_argumentcatch 块内的那些以及循环的后续迭代中的那些。

要解决此问题,您需要清除std::cin并消耗违规角色的状态。这在 KennyTM 指出的以下答案中得到了很好的解释:C++ character to int

于 2011-07-08T13:16:14.663 回答
0

您可以使用异常掩码,您可能会找到一种更好的方法来处理错误。

于 2011-07-08T13:27:56.013 回答