2016-09-29 10 views
0

私はそれを短く保つつもりです。例外/エラーがスローされたときのエラー処理

ルビでは、例外がスローされた場合に別の値を返す最も良い方法は何でしょうか?私は例外を私に知らせるためにエアブレーキを持っていますが、プロセスの継続を止めたくありません。開始ブロックよりも、この他を行うには、とにかくがある場合

house = House.find(1) 
visitor_count = begin 
        house.visitors.count 
       rescue => e 
        Airbrake.notify(e) 
        0 
       end 

疑問に思う:これまでのところ私はこのようなものを持っています。ありがとう!

+0

は、レスキューが、基本的なエラーです/開始します処理メカニズム。あなたのコードが動作しているようです。 –

+0

それは働いていますが、私は同じことをする他の方法があるかどうか疑問に思っていました。 – sclem72

+0

これは、 'StandardError'から延びる*すべての例外を救済することに注意してください。私はあなたが単純な例のためにこれをしたことを願っています。このような一般的な例外は、あなたが実際に期待しているものだけを盲目的に救済するべきではありません。 –

答えて

1

あなたのソリューションは(分離して)問題ありません。ここでは同じロジックを整理するための別の方法があります:

def num_house_visitors(id) 
    House.find(id).visitors.count 
rescue => e 
    Airbrake.notify(e) 
    0 
end 

でも、私はあなたが最初の場所で起こってから例外ケースを処理または予防しようとすることをお勧めします:

house = House.find_by(id: id) # assuming Rails/ActiveRecord 
house = Struct.new('MissingHouse', :visitors).new([]) if house.nil? # prevent nil errors 

# House#visitors (and MissingHouse#visitors) always returns an array 
vistor_count = house.visitors.count # this can't fail 
関連する問題