2016-02-19 94 views
-2

我有这样的:C++如何使用try catch并重新执行程序?

int main() { 
    try { 
     cin >> op; 
    } 
    catch (invalid_argument& e) { 
     cout << "Por favor indique um valor válido!!!"; 

    } 
} 

而我想的是,当它进入捕捞,程序重新执行,这样它会要求一个新的值给用户。

+0

@MadPhysicist告诉过你了。你需要使用一个循环,直到它被告知停止循环(例如,'do {...} while(...);'或'while(...){...}'loop) –

+0

这意味着我需要使用throw,这样我的do ... while得到这个值抛出知道如何停止对吗? –

+3

你有你的解决方案,但我不会推荐这个。不应该使用C++中的异常来改变程序的控制流。如果你期望用户有错误的价值,以至于你想给他另一个机会进入它,那不是一个例外。这并不总是很容易看到,但这似乎是一个不应该使用例外的场景。 – IceFire

回答

1

而且我希望当它进入捕获时,程序被重新执行,这样它会向用户要求一个新的值。

您可以将循环在你的try catch块:

int main() { 
    bool have_invalid_argument = true; 
    while(have_invalid_argument) 
     try { 
      cin >> op; 
      have_invalid_argument = false; 
     } 
     catch (invalid_argument& e) { 
      cout << "Por favor indique um valor válido!!!"; 

     } 
    } 
} 

你应该注意到虽然这

cin >> op; 

通常不会抛出该异常。

您应该使用std::basic_ios::exceptionsstd::ios_base::failure来检测输入分析错误。


如何解决这个问题?

选项1

都不要使用异常:

while(!(cin >> op)) { 
     cout << "Por favor indique um valor válido!!!"; 
     cin.clear(); // Reset the failure state 
     std::string dummy; 
     cin >> dummy; // consume the invalid input 

    } 

选项2

设置异常标志,赶上合适的异常

int main() { 
    cin.exceptions(std::ifstream::failbit); 
    bool have_invalid_argument = true; 
    while(have_invalid_argument) 
     try { 
      cin >> op; 
      have_invalid_argument = false; 
     } 
     catch (std::ios_base::failure &fail) { 
      cout << "Por favor indique um valor válido!!!";  
     } 
    } 
} 
+0

和我在哪里放? –

+0

@RuiEmanuelQuaresma您可以设置异常屏蔽标志,并在另一个“catch”块中捕获_ appropriate_异常。 –

+0

你能编辑你的代码吗? –

0

是这样做的(这是一种可以绕过它的方式)

char op ; 
int flag = 1; 
do 
{ 

    cout << "Indique a opção que corresponda ao exercicio desejado: " << endl << "1 - ex1.1;" << endl << "2 - ex1.2;" << endl << "3 - ex1.3;" << endl << "4 - ex1.4;" << endl << "5 - ex1.5;" << endl << "6 - ex1.6;" << endl; 
    cin >> op; 

    if (op == '1' || op == '2' || op == '3' || op == '4' || op == '5' || op == '6') { 

     flag = 0; 
    } 
    else { 
     cout << "Por favor indique um valor válido!!!"; 
    } 



} while (flag == 1);