Как мне написать обработку исключений для неправильного ввода? - PullRequest
5 голосов
/ 30 октября 2011

Я пытаюсь написать функцию, которая запрашивает у пользователя пятизначное число, и я хочу написать блок исключения для обработки неверного ввода, если пользователь пытается ввести строку или какой-либо нецелочисленный ввод.

Я знаю, как написать блок обработки исключений для чего-то вроде функции деления, в которой вы выдавали исключение для знаменателя, равного 0, но я понятия не имею, как это сделать для ввода, над которым у меня нет контроля.

Ответы [ 3 ]

7 голосов
/ 30 октября 2011

Прежде всего, я бы вообще посоветовал против этого - плохой ввод от пользователя - почти правило, а не исключение.

Если вы все равно настаиваете на этом, вы, вероятно, сделали бы это, приняв что-нибудь в качестве ввода, а затем выдав исключение, если / если это не то, что вы хотите:

// 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 голосов
/ 31 октября 2011

Исключения часто уместны при приеме данных с другого компьютера или процесса, когда нет никаких оснований ожидать, что в другом действительном потоке данных возникнут неверные данные.Что касается пользовательского ввода, исключения следует использовать только в тех случаях, которые должны представлять собой явное отклонение от нормального хода программы.Например, если программа имеет интерфейс в стиле tty, а подпрограмма, которая должна считывать строку ввода, получает элемент управления C, для такой подпрограммы может быть полезно вызвать исключение.Control-C не обязательно должен завершать программу, но если программа ожидает прочитать несколько строк ввода от пользователя, то при вводе control-C на одной часто будет пропущен остаток.

0 голосов
/ 30 октября 2011

Самое простое решение - прочитать строку и преобразовать ее в целое число, например, с помощью atoi. Если в результате вы получите ноль, и ваша строка не будет «0», вы знаете, что ввод не был числовым, без необходимости проходить через строку самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...