2017-03-20 7 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 

私は私が望むメッセージを表示することはできませんよ。

私はどのように私は、エラーメッセージをカスタマイズすることができ

「を整数にクラスの暗黙の変換」を取得していないのですか?

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

これはおそらく悪い考えです。 '.to_i'は変換するための安全な方法です。それは、それ自体を整数に強制することができるほとんどのものに作用します。そのようなハードキャスティングはかなり重い手のアプローチです。同様に、例外をランダムな出力に変換することは、重大な問題である可能性のあるものを無視するだけでは役に立ちません。 – tadman

+0

.to_iは私のニーズには適していません...私はブーリアンに対しても同じメッセージを得る必要があります。 –

答えて

0

ので、あなたのコードのようなものである必要があり、私はこれは良いアイデアだと思いますが、Integer(n)ArgumentErrorないTypeErrorを上げることを言っていません!私が探していたものが見つかりました:

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

obs:私は完全なコードを表示していないので、私は挑戦のためのスポイラーではありません。

+0

あなたは正しいかもしれないし、そうでないかもしれない:D ..これは、MatzがArgumentErrorのサブクラスであるTypeErrorであるという[リンク](https://bugs.ruby-lang.org/issues/2830)しかし、私は実際にTypeErrorとしてメッセージを表示する必要があります。 –

+0

私が知っているのは、 'Integer( 'a')'は私に 'ArgumentError'を与えます:)あなたのコードは少し混乱しています。行う? –

+0

もちろん混乱しています!私は学んでいます!笑!! :D 私はcodewars.comで挑戦しようとしています。私はそれをやる方法を考え出しました...そして、 "ベストプラクティス"の解決策を見た後に!ちょっとそれは本当に簡単でした! '整数(n) レスキュー raise TypeError.new"#{n}は無効です " –

1

OK:

+1

これは実際にはRubyの慣習の大部分を満たしています。メソッド名はすべて小文字にする必要がありますが、 'raise TypeError、" ... "'ここで 'new'は明示的に必要ではありません。 2番目の引数はコンストラクタに自動的に転送されます。 – tadman

+0

よくできました!これを見つけていただきありがとうございます!私はもっ​​と注意を払って、すべて小文字を保ちます! Tnks! –

関連する問題