当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用例外来中止一系列用户输入-好吗?坏?》经验,为你挑选了3个好方法。

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

如果我使用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上是非常可用的.我只是在寻找具体问题的答案.



1> Joey Adams..:

我个人会这样做:

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

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

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


你似乎已经打了我一分钟.+1快速打字!:-)

2> phoebus..:

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

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



3> Jerry Coffin..:

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

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

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

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有