【问题标题】:In Ruby, exception thrown when concatenating exception with String在 Ruby 中,将异常与 String 连接时引发异常
【发布时间】: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:in doCalc' 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 分配给了它自己。

标签: ruby exception-handling


【解决方案1】:

自从您将0 作为输入时,divide by 0 出现了异常。执行到rescue块,后来到ensure块,把msg留给nil类型,

你应该做的是如下所示,

def doCalc
    begin
        print( "Enter a number: " )
        aNum = gets().chomp()
        result = 100 / aNum.to_i
    rescue Exception => e
        result = 0
        msg = "Error: #{e.message}"
        puts("#{msg} \n Please try again." )
        retry   # retry on exception
    else
        msg = "Result = #{result}"
    ensure
        msg = "You entered '#{aNum}'. #{msg}"
    end
    return msg
end


puts( doCalc )

【讨论】:

  • @nanosoft 这有帮助吗?
猜你喜欢
  • 2010-09-08
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 2014-07-09
  • 2019-08-04
相关资源
最近更新 更多