考虑一种情况,其中控制台应用程序一个接一个地请求一系列输入.在继续下一个输入之前验证每个输入.现在,如果用户输入的内容无效,则会显示错误消息,并询问用户是否要继续.如果用户选择"否",则中止输入过程.如果用户选择是,则允许用户再次重新键入输入,并且通过询问剩余的输入继续该过程.
如果我使用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上是非常可用的.我只是在寻找具体问题的答案.
我个人会这样做:
bool valid = read("Name") && read("Age") && read("Sex") && read("DoB");
它相当于您发布的第一个代码.C++中的&&运算符从左到右计算术语,并在遇到错误结果时停止.这不是特定于编译器的hack,而是C,C++和许多其他基于C语言或受其启发的编程语言中定义良好的行为.
这也适用于||,但是当遇到真值而不是假值时它会停止.
我不会以这种方式使用异常,因为异常并不意味着用作控制流的机制.它们的存在是为了捕捉字面上的特殊情况,而不是像你描述的情况那样合理预期的输入.
有几个选项可以使用不同的模式对其进行编码,无论是使用标志还是使用if-chain,甚至将语句与布尔表达式一起链接,如另一个答案中所建议的那样(这也是我的首选方法).所有都有它们的优点和缺点,但IMO的例外绝对不是这样做的方式.
我想我会使用第一种方法,但结构有点不同:
bool valid = read("Name") && read("Age") && read("Sex") && read("DoB");
至少如果我理解你的要求,这似乎是比上述任何一种更简单的方法来满足它们.