2017-03-20 55 views
0

我正在嘗試執行safe_Int(n)。爲整數轉換自定義異常消息 - Ruby

如果輸入不是一個「整數」值(例如:123或123),它應該返回一個TypeError,並且消息「#{n}必須是一個數字」。

這裏是我做過什麼:

def safe_Int(n) 
begin 
    Integer(n) rescue TypeError 
rescue TypeError => e 
    puts "#{n} is not a number" 
end 
end 

我不能顯示我想要的消息。

我收到「類的隱式轉換成整數」

我如何自定義錯誤消息?

+1

這可能是一個壞主意。 '.to_i'是轉換的安全方式,它幾乎適用於所有可以強制轉換爲整數的東西。像這樣的硬鑄就是一種相當笨拙的做法。同樣,將異常轉換爲隨機輸出並不是真的有用,它只是忽略了可能是嚴重問題的東西。 – tadman

+0

.to_i不適合我的需求...我還需要獲取布爾值相同的消息。 –

回答

0

不是說我認爲這是一個好主意,但Integer(n)引發ArgumentError不是TypeError所以你的代碼應該是這樣的:

def safe_int(n) 
    Integer(n) 
rescue ArgumentError => e 
    puts "#{n} is not a number" 
end 
+0

你可能是對的或不是:D ..這是馬茨有一個討論[鏈接](https://bugs.ruby-lang.org/issues/2830)是TypeError ArgumentError的一個子類?但我真的需要它作爲類型錯誤,顯示該消息... –

+0

我所知道的是整數('a')'給了我一個'ArgumentError' :)你的代碼有點混亂,你能解釋你想要什麼做? –

+0

當然是混亂!我正在學!大聲笑!! :D 我想在codewars.com上提出挑戰。我想出瞭如何去做......在看到「最佳實踐」解決方案後!嘿,這真的很容易!'Integer(n) rescue raise TypeError.new「#{n} is invalid」' –

1

好!找到我正在尋找的東西:

def safe_Int(n) 
Integer(n) 
rescue 
    raise TypeError.new "#{n} is not a number!" 
end 

obs:我沒有顯示完整的代碼,所以我不會成爲挑戰的擾流板。

+1

這實際上藐視了很多Ruby約定,方法名應該全部小寫,但是如果這是您的目標,您只需要做所有事情是:'raise TypeError,「...」'其中'new'沒有明確的必要。第二個參數會自動轉發給您的構造函數。 – tadman

+0

幹得好!謝謝你發現這個!我會更加關注並保持全部小寫! TNKS! –