2017-03-06 58 views
-1

我在ruby中的代码下执行。在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:in ensure in doCalc' from retry.rb:15:in doCalc' from retry.rb:21:in '

我在控制台上输入0,因为我想检查这个错误处理代码是如何工作的。基本上想检查工作的重试。我的理解是如何重试作品,但因为它说,它已分配例外“E”是零,其水湿是情况下,如果我改变为线#15这个错误让我困惑:

puts e 

则没有错误出现。其实它打印:

divided by 0

我是经验丰富的java,但新的红宝石。我在这里错过了什么?

+1

你确定这不是这部分'味精=“您输入' #{aNum}'。“+ msg',因为'msg'可能在这里没有?特别是因为你堆栈跟踪明确引用问题是确保块。 – engineersmnky

+0

作为最后一个提示put将尝试和调用对象,所以在这种情况下,你应该添加'e.to_s'作为你的字符串程序集的一部分 – engineersmnky

+0

你的错误信息是没有意义的。你的代码中甚至没有21行,那么它怎么可能指向第21行?很明显,您发布的错误消息和您发布的代码不属于一个整体。不幸的是,如果我们不知道代码和错误信息是什么,那么我们无法帮助您。 –

回答

0

从你输入0作为输入时,有例外divide by 0。执行去rescue块,后来到ensure块,留下msgnil类型,

你应该已经做的是类似下面,

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) 
+0

@nanosoft对您有帮助吗? –