Rubyの組み込み例外クラスを調べる
タイトルがすべてなのだけれど、一覧は意外と見当たらないので作ってみた。
環境
% ruby -v
ruby 1.9.2p136 (2010-12-25 revision 30365) [i686-linux]
概要
- すべてのクラス定数を取得
- ancestorsにExceptionクラスをもつものをピックアップ
- ソートして表示
以下のコードはワンライナーで書いたものを整形してコメントを追記しただけ。参考にしたのはこちら。
すべての組み込み例外クラス
以下のようなコードを書いてみた。
puts Object.constants.find_all { |c|
(cc = Object.const_get(c)) && # シンボルからクラス定数を取得
cc.respond_to?(:ancestors) && # ancestorsメソッドを持つ
cc.ancestors.include?(Exception) # Exceptionとそのサブクラス
}.sort
結果は以下のとおり。
ArgumentError
EOFError
(snip)
TypeError
ZeroDivisionError
途中省略してる理由は後述。
ExceptionとStandardError
Rubyの組み込み例外クラスはすべて祖先に「Exception」を持つ。そのうち「通常のプログラムで発生する可能性の高い例外クラスを束ねるためのクラス」として「StandardError」がある。StandardErrorはrescue節で補足する例外クラス名を省略した場合のデフォルトとして使われる。
ということは、Exceptionを継承しつつStandardErrorを継承していないのはわりとfatalな(=補足すべきではない)例外なのだろう。これはわけて調べる必要がありそうだ。
冒頭の一覧が省略されているのはそんなような理由である。コード自体は抽出条件を変えるだけなのでほとんど同じ。
StandardError
puts Object.constants.find_all { |c|
(cc = Object.const_get(c)) && # シンボルからクラス定数を取得
cc.respond_to?(:ancestors) && # ancestorsメソッドを持つ
cc.ancestors.include?(StandardError) # StandardErrorとそのサブクラス
}.sort
ArgumentError
EOFError
EncodingError
FiberError
FloatDomainError
IOError
IndexError
KeyError
LocalJumpError
NameError
NoMethodError
RangeError
RegexpError
RuntimeError
StandardError
StopIteration
SystemCallError
ThreadError
TypeError
ZeroDivisionError
ライブラリの使い方を間違ったときなどによく見かけるエラーが並んでいる。
Exception
puts Object.constants.find_all { |c|
(cc = Object.const_get(c)) && # シンボルからクラス定数を取得
cc.respond_to?(:ancestors) && # ancestorsメソッドを持つ
cc.ancestors.include?(Exception) && # Exceptionとそのサブクラス
!cc.ancestors.include?(StandardError) # StandardErrorとそのサブクラス以外
}.sort
Exception
Interrupt
LoadError
NoMemoryError
NotImplementedError
ScriptError
SecurityError
SignalException
SyntaxError
SystemExit
SystemStackError
いかにも致命的っぽいエラーが並んでいる。「NoMemoryError」なんか間違っても握りつぶしちゃいけない雰囲気が漂っているよね。
まとめ
- Object.constantsで定数が取り出せる>定義済みのクラス名が含まれている
- Rubyの例外には2系統ある
- 例外を握りつぶすのはどこの世界でもご法度
Links
http://doc.okkez.net/static/192/class/Exception.html
通常のプログラムで発生する可能性の高い 例外クラスを束ねるためのクラス
http://doc.okkez.net/static/192/class/StandardError.html
トップオブジェクトが持つClassを全部表示する方法 – [サ]ロンパスの日記
http://d.hatena.ne.jp/saronpasu/20080227/1204120421