2014-02-11 61 views
4

我在C++的Fraction類中有一個重載操作符,它被設計爲以整數形式從標準輸入取整輸入,即整數形式,即1/232/4,並基於這些值初始化Fraction對象。它的工作原理,但我很難捕捉錯誤。如何拋出std :: invalid_argument錯誤?

// gets input from standard input in the form of (hopefully) int/int 
std::istream& operator >>(std::istream& inputStream, Fraction& frac) 
{ 
    int inputNumerator, inputDenominator; 
    char slash; 

    if ((std::cin >> inputNumerator >> slash >> inputDenominator) && slash == '/') 
    { 
     if (inputDenominator == 0) 
     { 
      std::cout << "Denominator must not be 0." << std::endl; 
      throw std::invalid_argument("Denominator must not be 0."); 
     } 
     frac.numerator = inputNumerator; 
     frac.denominator = inputDenominator; 

     frac.reduce(); 
    } 
    else 
    { 
     throw std::invalid_argument("Invalid syntax."); 
    } 



    return inputStream; 
} 

我調用的方法是這樣的:

Fraction frac(1, 2); 


while (true) 
{ 
    try { 
     std::cout << "Enter a fraction in the form int/int: "; 
     std::cin >> frac; 
     std::cout << frac; 
    } catch (std::invalid_argument iaex) { 
     std::cout << "Caught an error!" << std::endl; 
    } 
} 

但每當發生錯誤時,(我會進入類似garbage)這將導致循環永遠繼續下去,而不要求輸入。這是什麼原因?

+0

除了對你的代碼有一點意見:如果你寫的輸入'運算符<<,您應該使用傳遞給它的srteam而不是回落到'std :: cin'。然後這可以按預期工作:'ifstream if(somefile.txt);如果>> frac;' –

+0

您也可能想通過引用來捕獲異常,而不是通過值。 – BitTickler

回答

6

既然你不告訴我們你給你的程序輸入什麼,我只能猜測:

你鍵入的東西,CIN無法解析的序列inputNumerator >> slash >> inputDenominator,所以它進入了失效或壞的狀態。這個異常被拋出到函數的else分支中(你可以並且應該通過在你主函數的catch塊中打印異常的消息來測試)。

您的循環主要繼續,但cin處於不良狀態,因此每個後續輸入都會再次失敗,並且一次又一次拋出相同的異常。爲了防止在錯誤處理期間清除cin的狀態。此外,如果有輸入流中的壞人的角色不能被解析,他們已經被拋出,或ignore d:

if ((std::cin >> inputNumerator >> slash >> inputDenominator) && slash == '/') 
{ 
    /* ... */ 
} 
else 
{ 
    std::cin.clear(); // reset the fail flags 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //ignore the bad input until line end 
    throw std::invalid_argument("Invalid syntax."); 
} 
+0

我編輯了一下我的問題。我可以輸入任何不好的輸入,這會發生。例如'垃圾'作爲輸入或'steveaoki'。無論如何,我試過這個,它沒有工作。我在想這可能與我在函數中有一個inputstream的事實有關。 – michaelsnowden

+0

@doctordoder我編輯了答案,我首先錯過了對「錯誤」輸入的「忽略」。 –

+0

我其實只是找到了一個線程,它有相同的答案,它爲我工作,所以是的,我可以證實這一點。謝謝! – michaelsnowden