在下面的代码中重试并确保在出现错误时块无法正常工作。
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 )
请告诉我这里有什么问题。
答案 0 :(得分:3)
对以前的建议感到抱歉。我刚刚注意到错误的实际原因。以下是您的假设:
def doCalc
begin
print( "Enter a number: " )
aNum = gets().chomp()
result = 100 / aNum.to_i
#rescue Exception => e # - dont catch Exception unless you REALLY need it.
rescue => e # - this catches StandardError and is usually enough
result = 0
puts( "Error: #{e}\nPlease try again." ) # <-- changed here
retry # retry on exception
else
msg = "Result = #{result}"
ensure
msg = "You entered '#{aNum}'. " + msg
end
return msg
end
你实际上已经接连抛出了三个错误。
在您计划的第一个错误中 - 在解析和分割期间。它被rescue Exception => e
正确捕获。
但你不能&#34;添加&#34; &#34;例外&#34;到&#34;字符串&#34;。试图"asd" + e + "asd"
导致了另一个错误,那就是你的救援工作遭遇失败。块。但是,立即关注&#39;确保&#39;块必须运行,因此当您的救援块即将退出并引发另一个错误时,ensure
块被触发。
ensure
块无法将msg
添加到字符串中,因为此时msg
为nil
。因此,第三次引发异常,并成功隐藏了之前的所有异常。
简而言之:请注意我现在如何用字符串插值替换add-exception-to-a-string。您无法直接添加e
。您必须使用插值,或手动调用e.to_s
。