2016-02-19 58 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);