Ruby重试并确保阻止不起作用

时间:2013-12-04 12:20:36

标签: 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 )

请告诉我这里有什么问题。

1 个答案:

答案 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添加到字符串中,因为此时msgnil。因此,第三次引发异常,并成功隐藏了之前的所有异常。

简而言之:请注意我现在如何用字符串插值替换add-exception-to-a-string。您无法直接添加e。您必须使用插值,或手动调用e.to_s