akishin999の日記

調べた事などを書いて行きます。

後置の rescue では例外クラスを指定できない

タイトルの通りなんですが、知らなくてちょっと悩んだので忘れないようにメモ。

require 時の LoadError を無視したくて以下のようにしたところ、何度試しても rescue 出来ませんでした。

require 'hoge' rescue LoadError
#=> cannot load such file -- hoge (LoadError)

当たり前ですが以下のようにすれば問題ありません。

begin
  require 'hoge'
rescue LoadError
end

しばらく試行錯誤した末、ドキュメントをよくよく探してみると以下のように書いてあるのを発見。

捕捉する例外クラスを指定することはできません。 (つまり、StandardError 例外クラスのサブクラスだけしか捕捉できません)

http://docs.ruby-lang.org/ja/2.0.0/doc/spec=2fcontrol.html#begin

なるほど。
Ruby の rescue の後置記法(rescue 修飾子)って例外クラスを指定できないんですね。
以下のような書き方が特にエラーにならなかったので、普通に例外クラスは指定できているものだとばかり思っていましたが、どうやら間違いだったようです。

nil.hello rescue NoMethodError

どうしても一行で書きたい場合は以下のようにするしかないようです。

begin; require 'hoge'; rescue LoadError; end

同じキーワードなので動作も同じと勝手に思い込んでしまっていました。
こういう事もあるんですね。
気をつけねば。