如何避免使用Try Catch(C ++)在整数值中输入字符串

时间:2014-11-11 23:13:53

标签: c++ validation exception input try-catch

我只是希望用户使用Try Catch避免在Integer值中输入一个String,因为使用while循环根本不起作用。我知道如何在Java中使用Try Catch但我没有在C ++中使用。我一直在尝试这样的事情:

#include <iostream>

using namespace std;

main(){
   int opc;
   bool aux=true;
   do{
   try{
       cout<<"PLEASE INSERT VALUE:"<<endl;
       cin>>opc;
       aux=true;
   }
   catch(int e){
             aux=false;
             throw e;
             cout<<"PLEASE INSERT A VALID OPTION."<<endl;
           }
           }while(aux==false);
       system("PAUSE");
         }//main

3 个答案:

答案 0 :(得分:1)

更简单,更好的方法,但如果你真的想要例外,你可以启用它们并捕获std::ios_base::failure。像这样:

int main() {
    int opc;
    bool aux = true;
    cin.exceptions(std::istream::failbit);
    do {
        try {
            cout << "PLEASE INSERT VALUE:" << endl;
            cin >> opc;
            aux = true;
        }
        catch (std::ios_base::failure &fail) {
            aux = false;
            cout << "PLEASE INSERT A VALID OPTION." << endl;
            cin.clear();
            std::string tmp;
            getline(cin, tmp);
        }
    } while (aux == false);
    system("PAUSE");
}

答案 1 :(得分:0)

在正常情况下,std :: cin作为所有istreams在提供的数据不适合时不会抛出异常。流将其内部状态更改为false。所以你可以简单地做一些事情:

int n;
std::cin >>n;
if(!std::cin) {
 // last read failed either due to I/O error
 // EOF. Or the last stream of chars wasn't
 // a valid number
 std::cout << "This wasn't a number" << std::endl;
}

答案 2 :(得分:0)

int opc;
cin >> opc;

当您尝试读取非数字值时,将设置流的bad bit。您可以检查流是否处于良好状态。如果没有,请重置状态标志,如果需要,再次尝试读取。请注意,当设置了坏位时,将忽略任何后续读取。所以在另一个试验之前你应该做的是首先清除输入流的坏位并忽略其余的输入。

// If the input stream is in good state
if (cin >> opc)
{
   cout << opc << endl;
}
else
{
   // Clear the bad state
   cin.clear();

   // Ignore the rest of the line
   cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

// Now if the user enters an integer, it'll be read
cin >> opc;
cout << opc << endl;