🙌

[Feature #19620] rescue に渡せるオブジェクトの条件を緩和する提案

2024/07/12に公開

[Feature #19620] allow non-module rescue filters that implement the === opertor

  • 以下のように rescue には #=== をもったクラスオブジェクトやモジュールオブジェクトを渡してフィルターすることができる
module FooErrorFilter
  def self.===(e)
    e.message =~ /foo/
  end
end


begin
  raise 'foo error'

  # FooErrorFilter#=== が true だとその例外をキャッチする
rescue FooErrorFilter => e
  p e.message
  # => "foo error"
end
  • 現状はクラス/モジュールのオブジェクトしか渡すことができないのでその制限を外して任意のオブジェクトを渡せるようにする提案
  • 任意のオブジェクトを渡せるようにすると以下のように Proc オブジェクトを渡すこともできるようになる
begin
  raise 'foo error'
rescue -> e { e.message =~ /foo/ }
  p e.message
end
  • これができるようになると色々と捗りそうですかね〜〜〜
    • どうせならパターンマッチぽくかけるようにしたいのはある
  • それとは別にこんな感じでヘルパメソッド定義してそこで動的に Module を生成するようにするのはどうじゃろうか
def match(expr)
  Module.new {
    define_singleton_method(:===) { |e|
      expr === e
    }
  }
end


begin
  raise 'foo error'
  # match に #=== を持ったオブジェクトを好きに渡せる
  # () がないとシンタックスエラーになった :sob:
rescue match(-> e { e.message =~ /foo/ }) => e
  p e.message
  # => "foo error"
end
GitHubで編集を提案

Discussion