💭
[Feature #20484] 例外が発生するまで rescue のクラスが参照されない話
[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 は動的にクラス定義できたりもするので静的解析にも限界がありそう
- あと外部ファイルで定義されている場合とか
Discussion