2011-10-30 69 views
5

我想寫一個函數,提示用戶輸入一個五位數的數字,我想寫一個異常塊來處理不好的輸入,因爲用戶試圖輸入一個字符串或一些非整數輸入。如何編寫錯誤輸入的異常處理?

我知道如何編寫一個異常處理塊,用於像分割函數那樣引發分母爲0的異常,但是我不知道如何爲我無法控制的輸入做到這一點。

回答

7

首先,我通常會建議不要這樣 - 來自用戶的錯誤輸入幾乎是規則而非例外。

如果你堅持反正這樣做,你可能通過接受任何作爲輸入,然後拋出一個異常做到這一點當/如果這不是你想要的東西:

// Warning: untested code.  
// Accepting negative numbers left as an exercise for the reader. 
int get_int(std::istream &is) { 
    std::string temp; 

    std::getline(temp, is); 

    for (int i=0; i<temp.size(); i++) 
     if (!isdigit(temp[i])) 
      throw std::domain_error("Bad input"); 
    return atoi(temp); 
} 

我再說一遍,不過,我認爲這通常不是一個好主意。我注意到(舉一個例子),iostreams已經爲這種情況專門定義了一個fail位(並且正常的使用該機制的operator>>讀取int)。

+0

您使用'atoi()',但仍檢查您的字符串的每個字符爲非數字。爲什麼?? – vsz

+0

謝謝。出於某種原因,我被困在思維模式中,我的輸入必須存儲在整數變量中。將輸入接受爲字符串,然後轉換它可以解決我的問題。 – JeramyRR

+0

@vsz:他的問題是關於檢查不良輸入並在遇到異常時拋出異常。完成之後,'atoi'是返回int的最快最容易的方法。 –

0

最直接的解決方案是讀取一個字符串,並將其轉換爲整數,例如atoi。如果結果爲零,並且字符串不是「0」,那麼您知道輸入不是數字,不需要自己循環訪問字符串。

+0

不幸的是我需要用0來終止程序的輸入部分,所以我需要知道輸入是真實的0. – JeramyRR

+0

您可以單獨檢查輸入是否真的爲0。更詳細的討論可以在http://stackoverflow.com/questions/1640720/how-do-i-tell-if-the-c-function-atoi-failed-or-if-it-wasa-a-字符串的3/0 – vsz

0

從另一臺機器或進程接受數據時,如果沒有理由期望在其他有效數據流中出現無效數據,那麼異常通常是合適的。關於用戶輸入,例外應僅用於應該與正常程序流程明顯背離的情況。例如,如果一個程序有一個tty風格的接口,並且應該讀取一行輸入的例程獲得一個control-C,那麼這樣的例程可能會引發異常。控制-C不一定會結束程序,但如果程序期望從用戶讀取多行輸入,則在其中輸入control-C應該經常導致其餘部分被跳過。