考虑一个控制台应用程序一个接一个地请求一系列输入的场景。在继续下一个输入之前验证每个输入。现在,如果用户输入的内容无效,则会显示错误消息,并询问用户是否要继续。如果用户选择“否”,则中止输入过程。如果用户选择是,则允许用户再次重新输入输入,并通过询问剩余的输入继续该过程。
如果我使用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上非常有用。我只是在寻找具体问题的答案。
答案 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");
至少如果我理解你的要求,这似乎是比上述任何一种更简单的方法。