🌊
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>
1行で rescue 句を利用する
他の書き方として 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