Rubyの例外と rescue の範囲まとめ
rescue の正体
begin
# 処理
rescue
# ここ
end
rescue は 何も指定していないと、
StandardError とそのサブクラスだけを捕まえるというルールがある。
これは省略形で、実際にはこう書かれているから!
rescue StandardError
StandardError とそのサブクラスだけを捕まえる
Exception
├── StandardError ← rescue がデフォルトで捕まえる
│ ├── ArgumentError
│ ├── RuntimeError
│ └── ...
├── ScriptError ← rescue では捕まえない
├── NoMemoryError
└── SystemExit
試験用・超重要まとめ
rescue 単体 = rescue StandardError
これを覚えておけば即答できる。
なぜ Exception を rescue しないの?
理由は 危険だかららしい。
SystemExit(exit)
NoMemoryError(メモリ不足)
まで捕まえてしまうと、プログラムが正常に終了できなくなる。
だから Ruby はデフォルトで StandardError だけだって。
1.Exception(すべての例外の親)
Rubyの全エラーの大元
直接使うことはほぼない
ポイント
rescue 単体では 捕まらない
捕まえるには rescue Exception と書く必要がある(非推奨)
2.StandardError(通常のエラー)
プログラム実行中によく起きるエラー
rescue が デフォルトで捕まえる
2-1.ArgumentError
def f(x); end
f(1, 2)
# => ArgumentError
意味
・引数がおかしい
・数が違う
・値の形式が違う
試験ワード
「引数」
2-2.RuntimeError
raise
# => RuntimeError
意味
Rubyが用意した分類に当てはまらない一般的なエラー
raise を何も指定せずに使うとこれ
試験ワード
「汎用エラー」
2-3.NoMethodError
nil.foo
# => NoMethodError
意味
そのメソッドは存在しない
nil にメソッド呼んだ
試験ワード
「存在しないメソッド」
3.ScriptError(コード自体が壊れてる)
end
end
# => ScriptError
意味
プログラムの構造がおかしい
文法ミス
読み込み失敗
代表例
・SyntaxError
・LoadError
※rescue では捕まえない
試験ワード
「書き方が間違っている」
4.SystemExit(プログラム終了)
exit
# => SystemExit
意味
プログラムを終了しろ、という合図
正常終了も含む
※rescue で捕まえない
(捕まえると終了できなくなる)
試験ワード
「exit」
5.
NoMemoryError(メモリ不足)
a = []
loop { a << "x" * 10_000_000 }
# => NoMemoryError
意味
・メモリが足りない
・システム的に危険
捕まえてもどうにもならない
※rescue で捕まえない
試験ワード
「メモリ不足」
1行ずつ覚えるなら
ArgumentError → 引数ミス
NoMethodError → メソッドない
ScriptError → 書き方ミス
SystemExit → exit
NoMemoryError → メモリ不足