我想寫一個函數,提示用戶輸入一個五位數的數字,我想寫一個異常塊來處理不好的輸入,因爲用戶試圖輸入一個字符串或一些非整數輸入。如何編寫錯誤輸入的異常處理?
我知道如何編寫一個異常處理塊,用於像分割函數那樣引發分母爲0的異常,但是我不知道如何爲我無法控制的輸入做到這一點。
我想寫一個函數,提示用戶輸入一個五位數的數字,我想寫一個異常塊來處理不好的輸入,因爲用戶試圖輸入一個字符串或一些非整數輸入。如何編寫錯誤輸入的異常處理?
我知道如何編寫一個異常處理塊,用於像分割函數那樣引發分母爲0的異常,但是我不知道如何爲我無法控制的輸入做到這一點。
首先,我通常會建議不要這樣 - 來自用戶的錯誤輸入幾乎是規則而非例外。
如果你堅持反正這樣做,你可能通過接受任何作爲輸入,然後拋出一個異常做到這一點當/如果這不是你想要的東西:
// 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)。
從另一臺機器或進程接受數據時,如果沒有理由期望在其他有效數據流中出現無效數據,那麼異常通常是合適的。關於用戶輸入,例外應僅用於應該與正常程序流程明顯背離的情況。例如,如果一個程序有一個tty風格的接口,並且應該讀取一行輸入的例程獲得一個control-C,那麼這樣的例程可能會引發異常。控制-C不一定會結束程序,但如果程序期望從用戶讀取多行輸入,則在其中輸入control-C應該經常導致其餘部分被跳過。
您使用'atoi()',但仍檢查您的字符串的每個字符爲非數字。爲什麼?? – vsz
謝謝。出於某種原因,我被困在思維模式中,我的輸入必須存儲在整數變量中。將輸入接受爲字符串,然後轉換它可以解決我的問題。 – JeramyRR
@vsz:他的問題是關於檢查不良輸入並在遇到異常時拋出異常。完成之後,'atoi'是返回int的最快最容易的方法。 –