我需要重试不正确的用户输入,但我的代码不起作用
def parse_param begin option = gets.chomp option = option.to_i rescue retry if option > 6 end
字符串我做错什么了?
dffbzjpn1#
我做错什么了?只有在begin块中发生异常时,才会进入rescue部分(参见Exception Handling的文档)。由于您自己没有引发任何异常,其余代码也没有引发异常,因此不会执行rescue部分。你可以通过这种方式手动抛出一个异常:(仅用于演示)
begin
rescue
def parse_param begin option = gets.chomp option = option.to_i raise if option > 6 option rescue retry end end
字符串然而,仅仅为了立即挽救它而提出一个例外是过于复杂的。此外,例外应用于例外情况,即您的代码无法正确处理的意外事件,应将其升级到调用方。对于正常的控制流,您可以使用简单的loop沿着break,例如:
loop
break
def parse_param loop do option = gets.chomp.to_i break option unless option > 6 end end
型Ruby还有一个redo语句,可以用来重新运行当前的迭代:(虽然很少见到)
redo
def parse_param loop do option = gets.chomp.to_i redo if option > 6 break option end end
型
8yparm6h2#
answer of Stefan已经解释了当前解决方案不起作用的原因。我只是想增加一个额外的选择。您可以使用while或until来代替使用loop进行循环。
while
until
def parse_param option = gets.chomp.to_i while !option || option > 6 option end
字符串请注意,我们需要!option作为额外的检查,因为在第一次检查时option的初始值是nil。
!option
option
nil
2条答案
按热度按时间dffbzjpn1#
我做错什么了?
只有在
begin
块中发生异常时,才会进入rescue
部分(参见Exception Handling的文档)。由于您自己没有引发任何异常,其余代码也没有引发异常,因此不会执行
rescue
部分。你可以通过这种方式手动抛出一个异常:(仅用于演示)
字符串
然而,仅仅为了立即挽救它而提出一个例外是过于复杂的。此外,例外应用于例外情况,即您的代码无法正确处理的意外事件,应将其升级到调用方。
对于正常的控制流,您可以使用简单的
loop
沿着break
,例如:型
Ruby还有一个
redo
语句,可以用来重新运行当前的迭代:(虽然很少见到)型
8yparm6h2#
answer of Stefan已经解释了当前解决方案不起作用的原因。我只是想增加一个额外的选择。
您可以使用
while
或until
来代替使用loop
进行循环。字符串
请注意,我们需要
!option
作为额外的检查,因为在第一次检查时option
的初始值是nil
。