🌊
Ruby で1行 rescue 句
rescue
句は通常 begin ~ end
などと一緒に利用し、その間に発生した例外をキャッチする機構になります。
begin
1 + "hoge"
# begin ~ rescue で例外が発生すると例外オブジェクトを受け取り rescue が呼ばれる
rescue => e
pp e
# => #<TypeError: String can't be coerced into Integer>
end
次のように def ~ end
間でも利用できます。
def plus(a, b)
a + b
# def ~ rescue で発生した例外をキャッチする
rescue => e
e
end
pp plus(1, "hoge")
# => #<TypeError: String can't be coerced into Integer>
rescue
句を利用する
1行で 他の書き方として rescue
は 式1 rescue 式2
のように書くこともできます。
この場合は 式1
を評価し、例外が発生すれば 式2
を評価するような処理になります。
# 式1 は例外が発生しないのでそのまま評価された値を返す
pp (1 + 2 rescue "hoge") # => 3
# 式1 が例外になるので式2 が評価されて値を返す
pp (1 + "bar" rescue "foo") # => "foo"
# 式1 も式2 も例外になる場合は例外が発生する
pp (1 + "bar" rescue "foo" + 2) # error: no implicit conversion of Integer into String (TypeError)
後置 if / unless
だと右から左に処理されるんですが rescue
の場合は左から右に向かって処理される感じですね。
どちらかというと &&
||
に近い感じですかねー。
Discussion