优雅地检查用户输入是否有错误

时间:2013-03-14 08:52:57

标签: c++ if-statement error-handling

我的程序等待用户输入,并在适当时处理它。我需要检查用户输入以确保它符合某些标准,如果它不符合所有这些标准,它将被拒绝。

伪代码就像:

if (fulfills_condition_1)
{
    if (fulfills_condition_2)
    {
        if (fulfills_condition_3)
        {
            /*process message*/
        }
        else
            cout << error_message_3; //where error_message_1 is a string detailing error
    }
    else
        cout << error_message_2; //where error_message_2 is a string detailing error
}
else
    cout << error_message_1; //where error_message_3 is a string detailing error

这些条件的数量可能会增加,我想知道是否有更简洁的方法来表示使用开关或类似的东西而不是大量的级联if语句。

我知道有可能使用

if (fulfills_condition_1 && fulfills_condition_2 && fulfills_condition_3)
    /*process message*/
else
    error_message; //"this message is not formatted properly"

但这没有第一个那么有用,也没有说明问题出在哪里。

条件可以粗略地安排得越来越重要,即检查condition_1比检查condition_3更重要,因此if语句确实有效 - 但有更好的方法吗?一般来说这样做?

4 个答案:

答案 0 :(得分:2)

怎么样

if (!fulfills_condition_1) throw BadInput(error_message_1);
if (!fulfills_condition_2) throw BadInput(error_message_2);
if (!fulfills_condition_3) throw BadInput(error_message_3);

/* process message */

然后您的异常处理程序可以报告错误消息,并根据需要重试或中止。

答案 1 :(得分:2)

如果困扰你的是级联if,你可以选择以下其中一项:

使用布尔值:

bool is_valid = true;
string error = "";
if (!condition_one) {
  error = "my error";
  is_valid = false;
}

if (is_valid && !condition_two) {
  ...
}

...

if (!is_valid) {
  cout << error;
} else {
  // Do something with valid input
}

使用例外:

try {
  if (!condition_one) {
    throw runtime_error("my error");
  }

  if (!condition_two) {
    ...
  }

  ...

} catch (...) {
  // Handle your exception here
}

答案 2 :(得分:1)

我建议你可以使用“早退”技术:

  if (!fulfills_condition_1)
     // error msg here.
     return;

  // fulfills_condition1 holds here.

  if (!fulfills_condition_2)
     // error msg here.
     return;

  // Both conditon1 and condition2 hold here.

  if (!fulfills_condition_3)
     // error msg here.
     return.

答案 3 :(得分:1)

如果要在几个地方重复使用,我会制作一个DSL:

Validator inputType1Validator =
    Validator.should(fulfill_condition_1, error_message_1)
             .and(fulfill_condition_2, error_message_2)
             .and(fulfill_condition_3, error_message_3)

inputType1Validator.check(input);