はじめに
Ruby初学者の備忘録です。
例外クラスの継承関係
※すべての例外クラスを網羅しているわけではありません。
Exception
│
├─ NoMemoryError # メモリ確保に失敗した場合に発生
│
├─ ScriptError # スクリプト実行時に発生する例外の基底クラス
│ ├─ LoadError # ライブラリの読み込みに失敗した場合に発生
│ ├─ NotImplementedError # メソッドが実装されていない場合に発生
│ ├─ SyntaxError # スクリプトに構文エラーがある場合に発生
│ └─ Gem::LoadError # RubyGemsに関連する読み込みエラーが発生した場合に発生
│
├─ SignalException # システムシグナルによって発生する例外の基底クラス
│ └─ Interrupt # Ctrl-C などでプログラムが中断された場合に発生
│
├─ StandardError # アプリケーションで一般的に捕捉される例外の基底クラス
│ ├─ ArgumentError # 引数が正しくない場合に発生
│ ├─ EncodingError # 文字コード変換や変換不可能な文字がある場合に発生
│ │ ├─ Encoding::CompatibilityError # 文字コードが互換性がない場合に発生
│ │ └─ Encoding::UndefinedConversionError # 文字コード変換で未定義の変換が行われた場合に発生
│ ├─ IOError # I/O操作に関連するエラーが発生した場合に発生
│ │ ├─ EOFError # ファイルの終端に達した場合に発生
│ │ └─ ClosedStreamError # 閉じられたストリームに対してI/O操作を行おうとした場合に発生
│ ├─ IndexError # 配列や文字列などのインデックスが範囲外の場合に発生
│ │ ├─ KeyError # ハッシュで存在しないキーを参照した場合に発生
│ │ └─ StopIteration # 繰り返し処理が終了したことを示すために発生
│ ├─ LocalJumpError # ブロックが与えられないメソッドに対してブロックが渡された場合や、渡されていない場合に発生
│ ├─ NameError # 未定義の変数やメソッドを参照しようとした場合に発生
│ │ └─ NoMethodError # 存在しないメソッドが呼び出された場合に発生
│ ├─ RangeError # 範囲外の数値が指定された場合に発生
│ │ ├─ FloatDomainError # 浮動小数点数が無限大やNaN(非数)になった場合に発生
│ │ └─ NumericalComparisonError # 数値と比較できないオブジェクトと比較しようとした場合に発生
│ ├─ RuntimeError # 他の特定の例外クラスに該当しない実行時エラーが発生した場合に発生
│ │ ├─ FiberError # ファイバが正しくない状態で操作された場合に発生
│ │ └─ Gem::ConflictError # RubyGemsの依存関係に問題がある場合に発生
│ ├─ SecurityError # セキュリティポリシーに違反する操作が行われた場合に発生
│ ├─ SystemCallError # システムコールが失敗した場合に発生する例外の基底クラス
│ │ └─ Errno::* # 各種のシステムエラーを表すErrnoクラスがあります
│ ├─ ThreadError # スレッド操作に関連するエラーが発生した場合に発生
│ ├─ TypeError # オブジェクトの型が適切でない場合に発生
│ └─ ZeroDivisionError # 0で除算しようとした場合に発生
│
└─ SystemStackError # スタックオーバーフローが発生した場合に発生
-
この図では、
Exception
クラスが最上位にあり、それ以下に様々な例外クラスが継承されています。StandardError
クラスは、一般的な例外を表すクラスで、アプリケーションで捕捉される例外の基底クラスです。他のクラスは、それぞれ特定の種類のエラーを表します。 -
何もクラスを指定しなかった場合にrescue節で捕捉されるのはStandardErrorクラスです。
※「補足」と「捕捉」
「補足」は、説明の不十分な箇所を付け足して補うこと。
「捕捉」は、何かを捕らえる、あるいは、文章などの内容を把握すること。
さいごに
例外処理は「ここぞ!」というときにだけ使う機能です。(チェリー本 p.401より)