使用例外来中止一系列用户输入 - 好吗?坏?

时间:2009-12-15 03:57:17

标签: c++ exception

考虑一个控制台应用程序一个接一个地请求一系列输入的场景。在继续下一个输入之前验证每个输入。现在,如果用户输入的内容无效,则会显示错误消息,并询问用户是否要继续。如果用户选择“否”,则中止输入过程。如果用户选择是,则允许用户再次重新输入输入,并通过询问剩余的输入继续该过程。

如果我使用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 个答案:

答案 0 :(得分:10)

我个人会这样做:

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

它相当于您发布的第一个代码。和&& C ++中的运算符从左到右计算术语,并在遇到错误结果时停止。这不是特定于编译器的hack,而是C,C ++和许多其他基于C语言或受其启发的编程语言中明确定义的行为。

这也适用于||,但是当遇到真值而不是假值时它会停止。

答案 1 :(得分:5)

我不会以这种方式使用异常,因为异常并不意味着用作控制流的机制。它们的存在是为了捕捉特殊的情况,而不是像你描述的情况那样合理预期的输入。

有几个选项可以使用不同的模式对此进行编码,无论是使用标志还是使用if-chain,甚至将语句与布尔表达式一起链接,如另一个答案中所建议的那样(这也是我的首选方法) )。所有这些都有其优点和缺点,但IMO的例外情况绝对不是这样做的。

答案 2 :(得分:5)

我认为我会使用第一种方法,但结构有点不同:

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

至少如果我理解你的要求,这似乎是比上述任何一种更简单的方法。