【发布时间】:2017-03-06 14:17:27
【问题描述】:
我在 ruby 中执行了下面的代码。
代码:
def doCalc
begin
print( "Enter a number: " )
aNum = gets().chomp()
result = 100 / aNum.to_i
rescue Exception => e
result = 0
puts( "Error: " + e + "\nPlease try again." )
retry # retry on exception
else
msg = "Result = #{result}"
ensure
msg = "You entered '#{aNum}'. " + msg
end
return msg
end
puts( doCalc )
出现错误:
retry.rb:15:in
+': can't convert nil into String (TypeError) from retry.rb:15:inensure in doCalc' 来自 retry.rb:15:indoCalc' from retry.rb:21:in'
我在控制台上输入了 0,因为我想检查这个错误处理代码是如何工作的。基本上想检查 retry 的工作情况。我明白重试是如何工作的,但是这个错误让我感到困惑,因为它说'e'已经分配了异常是 nil 这不可能是这样的,就像我将第 15 行更改为:
puts e
那么就不会出现错误。事实上它打印:
除以 0
我是经验丰富的 java,但对 ruby 很陌生。我在这里错过了什么?
【问题讨论】:
-
你确定不是这部分
msg = "You entered '#{aNum}'. " + msg因为msg可能在这里为零?特别是因为您的堆栈跟踪清楚地引用了确保块的问题。 -
作为最后一点,puts 将尝试调用对象上的 to_s,所以在这种情况下,您应该添加
e.to_s作为字符串程序集的一部分 -
您的错误信息毫无意义。您的代码中甚至没有 21 行,那么它怎么可能引用第 21 行呢?很明显,您发布的错误消息和您发布的代码不属于一起。很遗憾,如果我们不知道代码和错误消息是什么,我们无能为力。
-
但是,我最好的猜测是错误出现在第 13 行,您实际上将
msg分配给了它自己。