🌊

Ruby で1行 rescue 句

2024/10/28に公開

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 の場合は左から右に向かって処理される感じですね。
どちらかというと && || に近い感じですかねー。

GitHubで編集を提案

Discussion