Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
例外クラス / StandardError / RuntimeError
Rubyには用途別に分類された例外クラスが用意されています。独自の例外クラスを定義して使うこともできます。
構文
# 独自例外クラスを定義します。
class カスタムエラー < StandardError
def initialize(msg = "デフォルトメッセージ")
super
end
end
# 独自例外を発生させます。
raise カスタムエラー
raise カスタムエラー, "詳細なメッセージ"
raise カスタムエラー.new("メッセージ")
# 例外クラスの階層を確認します。
puts エラークラス.ancestors
主要な例外クラス
| 例外クラス | 概要 |
|---|---|
| StandardError | 一般的なエラーの基底クラスです。独自例外はこれを継承します。 |
| RuntimeError | 『raise』にクラスを指定しない場合に発生するデフォルトの例外です。 |
| TypeError | 型が不正な場合に発生します(例:文字列と整数の加算)。 |
| ArgumentError | 引数の数や値が不正な場合に発生します。 |
| NameError | 未定義の変数・メソッド名を参照した場合に発生します。 |
| NoMethodError | 存在しないメソッドを呼び出した場合に発生します(NameError のサブクラス)。 |
| ZeroDivisionError | 整数をゼロで除算した場合に発生します。 |
| IOError | ファイルやストリーム操作に失敗した場合に発生します。 |
| Errno::ENOENT | ファイルやディレクトリが見つからない場合に発生します。 |
サンプルコード
# 独自例外クラスを定義します。
class バリデーションエラー < StandardError
attr_reader :フィールド名
def initialize(フィールド名, msg = nil)
@フィールド名 = フィールド名
super(msg || "#{フィールド名}の値が不正です。")
end
end
class 年齢エラー < バリデーションエラー; end
# 独自例外を発生させて補足します。
def ユーザーを登録する(名前, 年齢)
raise バリデーションエラー.new("名前"), "名前は必須です。" if 名前.empty?
raise 年齢エラー.new("年齢"), "年齢は0以上を指定してください。" if 年齢 < 0
puts "#{名前}(#{年齢}歳)を登録しました。"
end
begin
ユーザーを登録する("田中", 25)
ユーザーを登録する("", 20)
rescue 年齢エラー => e
puts "年齢エラー: #{e.message}"
rescue バリデーションエラー => e
puts "バリデーションエラー[#{e.フィールド名}]: #{e.message}"
end
概要
Rubyの例外クラスは『Exception』を頂点とする階層構造になっています。通常は『StandardError』のサブクラスを使い、独自例外も『StandardError』を継承して定義します。
独自例外クラスを定義すると、エラーの種類を明確に区別でき、呼び出し側で適切に対処できます。『rescue Exception』と書くと『SignalException』や『SystemExit』など終了シグナルまで補足してしまい、Ctrl+Cでプログラムを終了できなくなります。基本的に『rescue StandardError』か、特定のサブクラスを指定してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。