2016-04-22 10 views
0

私はYYYY-DD-MMの形式でなければならないparamsから文字列の日付を取得しています。パラメータが無効な日付の場合はnilminimumに割り当てます。 paramが例えば2013-40-50だった場合のように。私は成功し、そうすることができる午前:.tryメソッドがプログラムを終了するのはなぜですか?

minimum = Date.try(:parse, (params[:newer_than])) if params[:newer_than].present?

日付が正しい形式であれば、それはminimumに割り当てられ、それ以外nilがあります。ただし、nilの場合、プログラムは終了し、ArgumentError - 無効な日付が返されます。

.tryを使って私が考えているのは、実際には失敗しても大丈夫だということです。私はそれが後で無ければ、その事件を処理している。 minimumに割り当てられた行でエラーがスローされます。

どのように達成できますか? methosがオブジェクトに定義されている場合

minimum = begin 
    Date.parse(params[:newer_than]) 
rescue ArgumentError, TypeError 
    nil 
end 

docsによると、普通のRubyのオブジェクト#のようなtryを送るので、ArgumentErrorTypeErrorのようなエラーを防ぐことはできません。

答えて

1

あなたはあなたの目標のためにrescueを使用することができます。

+0

大変ありがとうございます – Abd00s

2

これは、通話を使用する方法です。

tryコールは開始/救助のようなものではありません。そのオブジェクト上に関数が存在する場合、その関数を呼び出そうとします。関数が存在しない場合、関数は呼び出さず、そのまま処理を進めます。そうでなければ、それはそれを呼び出し、通常どおりに動作します。

この場合、tryを呼び出すと、その関数が日付用であることがわかっているので、良いことはありません。何が起こっているのは、関数がエラーを投げているparseです。

代わりに行うべきことは、begin/rescueブロック内でDate.parseを呼び出して、parse関数によってスローされる特定のエラー(ArgumentError)をキャッチすることです。また、parseを呼び出す前に文字列を(正規表現などを使用して)事前に検証して、正しい形式になっていることを確認することもできます。

いずれにしても、parseはあなたのための検証を行わないため、手動で確認したり、スローされたエラーを開始/救済することができます。

+0

ありがとうございました – Abd00s

関連する問題