Использование исключений для отмены ряда пользовательских вводов - Хорошо? Плохой? - PullRequest
1 голос
/ 15 декабря 2009

Рассмотрим сценарий, в котором консольное приложение запрашивает серию входов, один за другим. Каждый вход проверяется перед переходом к следующему. Теперь, если ввод, сделанный пользователем, является недействительным, отображается сообщение об ошибке, и пользователя спрашивают, хочет ли он / она продолжить. Если пользователь выбирает нет, процесс ввода прерывается. Если пользователь выбирает «да», ему разрешается повторно вводить ввод, и процесс продолжается, запрашивая остаток от введенных данных.

Если бы я использовал метод read () для обработки ввода пользователя (который также проверяет ввод и спрашивает, хочет ли пользователь продолжить [y / n]), который возвращает false, если пользователь решает не продолжать, тогда я бы необходимо проверять результат каждого вызова read (), прежде чем переходить к следующему

Например:

 bool valid = read("Name");
 if (valid) valid = read("Age");
 if (valid) valid = read("Sex");
 if (valid) valid = read("DoB");

 if(valid)
 {
    // do stuff
 }

В качестве альтернативы, я могу заставить метод read () выдавать исключение, если пользователь решит прекратить, и в этом случае мой код станет:

 try {
    read("Name");
    read("Age");
    read("Sex");
    read("DoB");

    // do stuff
 }catch(input_exception& e)
 {}

Какой из этих подходов вы бы выбрали и почему? (Предположим, что метод read () правильно выдает исключение после очистки)

ПРИМЕЧАНИЕ: Я не ищу аргументов за и против исключений, которые в изобилии доступны в SO. Я только ищу ответ на конкретный вопрос.

Ответы [ 3 ]

10 голосов
/ 15 декабря 2009

Лично я бы сделал это примерно так:

bool valid = read("Name")
          && read("Age")
          && read("Sex")
          && read("DoB");

Это эквивалентно первому коду, который вы опубликовали. Оператор && в C ++ оценивает термины слева направо и останавливается, когда встречается ложный результат. Это не хак для конкретного компилятора, а четко определенное поведение в C, C ++ и многих других языках программирования, основанных или вдохновленных C.

Это также работает для ||, но останавливается, когда встречается истинное значение, а не ложное.

5 голосов
/ 15 декабря 2009

Думаю, я бы использовал первый подход, но структурировал его немного по-другому:

bool valid = read("Name") && read("Age") && read("Sex") && read("DoB");

По крайней мере, если я правильно понимаю ваши требования, это будет более простой способ удовлетворить их, чем любой из вышеперечисленных.

5 голосов
/ 15 декабря 2009

Я бы не использовал исключения таким образом, поскольку исключения не предназначены для использования в качестве механизма управления потоком. Они существуют для того, чтобы буквально уловить исключительные обстоятельства, а не разумно ожидаемый вклад, как в случае, который вы описываете.

Есть несколько вариантов кодирования этого с использованием другого шаблона, будь то использование флага, или цепочки if, или даже связывание операторов вместе с логическим выражением, как предложено в другом ответе (это также был бы мой предпочтительный метод ). У всех есть свои плюсы и минусы, но исключения, IMO, определенно не способ сделать это.

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