2017-03-06 74 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對您有幫助嗎? –