在以下程序中:
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"异常时进入无限循环。实际上catch-block中的"cin>>c
"语句有问题,但不知道为什么会出现这种情况。
当std::cin>>a>>b
遇到非数字字符时,会发生两件相关的事情:
- 违规字符不被消耗;
- 设置
std::cin
失效位。
后者阻止所有从std::cin
进一步读取成功。这包括在invalid_argument
catch块中的那些和在循环的后续迭代中的那些。
要解决这个问题,您需要清除std::cin
的状态并消耗违规字符。下面KennyTM给出的答案很好地解释了这一点:c++ character to int.
您可以使用异常掩码,您可能会找到更好的方法来处理错误。