💭

[Feature #20484] 例外が発生するまで rescue のクラスが参照されない話

2024/05/13に公開

[Feature #20484] A new pragma for eager resolution of classes referenced in rescue clauses.

  • 次のように rescue でクラスを参照しているときに『実際に例外が排出されるまで』クラスの有無はチェックされない
  • なので以下のようなコードを実行したときに Hoge が定義されていなくてもエラーにはならない
begin

rescue Hoge => e
end
  • 以下のように例外が発生して初めて『クラスが定義されているかどうか』がチェックされる
begin
  raise "hoge"

# error: uninitialized constant Hoge (NameError)
rescue Hoge => e
end
  • これを実行前に読み込むようにする提案
    • 起票者は pragma comment で制御できるようにする提案をしている
  • これは知らなかった
  • 起票者は以下のような間違ったコードを書いてたけど気づくのに遅れた、と問題定義していますね
begin

# 本来は SomeModule::SomeClass であるのが正しいが SomeClass になってしまっていた
# この問題が実際に例外が発生するまで問題に気づかなかった
rescue SomeClass => e
end
  • これは確かに気づかないかも
  • とはいえこれは rescue だけの問題ではなくて他の構文でも同じですね
  • 例えばコメントでは if 文の例が提示されています
if true
else
  # これは else 節に来るまで実行されないのでエラーにならない
  Hoge
end
  • うーん確かにこれは実行されないすねー
  • こういうのは静的解析ツールで対応するのがいい、とコメントされていますねえ
  • ただ Ruby は動的にクラス定義できたりもするので静的解析にも限界がありそう
    • あと外部ファイルで定義されている場合とか
GitHubで編集を提案

Discussion