はじめに
JavaScript の try...catch に慣れていると、Ruby の rescue ( レスキュー ) にも似たような感覚で入ることができます。しかし、Rubyでは 「何のエラーを捕まえるか」 まで指定できるという点で大きく異なります。
その中心にあるのが StandardError です。
Ruby の StandardError とは?
StandardError は Ruby の 組み込みクラス で、よくあるエラー(例外)の親クラスです。
組み込みクラス
Ruby が最初から用意しているクラスのこと
Rubyの例外階層はこうなっています:
Exception
└── StandardError
├── ZeroDivisionError ( 🔥 0で割ろうとしたときに発生 )
├── TypeError ( 🔥 型が合わない操作をしたときに発生 )
├── NameError ( 🔥 存在しない変数やメソッド名を使ったときに発生 )
├── ArgumentError ( 🔥 引数の数や内容が正しくないときに発生 )
└── ...
rescue の基本形
begin
10 / 0
rescue StandardError => e
puts "エラー発生: #{e.message}" # => "divided by 0"
end
JavaScript の try...catch との比較
JavaScript の例
try {
throw new Error("問題発生!");
} catch (e) {
console.error(e.message); // => "問題発生!"
}
| 観点 | Ruby (rescue) |
JavaScript (catch) |
|---|---|---|
| デフォルトで捕まる範囲 |
StandardError のみ |
Error を継承するすべての例外 |
| エラーの種類指定 |
rescue ZeroDivisionError など可能 |
catch ブロック内で instanceof などで分岐 |
| 捕まらないエラー |
NoMemoryError など致命的なもの |
catch では基本すべて捕まる |
StandardError を使うメリット
- Rubyの
rescueはStandardErrorをデフォルトで捕まえる設計なので、明示しても 省略してもOK - よくあるエラー(0除算、引数ミスなど)を 一括でキャッチできる
-
rescue StandardError => eとすれば、エラー内容のログ出力やデバッグがしやすい
注意点・デメリット
-
StandardErrorに含まれないエラー- 例:
- SyntaxError ( Rubyの文法が間違っているときに発生 )
-
SystemExit ( exit メソッドを呼び出したときに発生する特別な例外 )は
rescueできない
- 例:
- エラーの種類を区別せず
rescueすると、バグを隠してしまう可能性あり - 明示的にエラータイプを分けないと、後から読んだときに「なぜ捕まえているのか」が不明確になりやすい
一般的な使い方(ベストプラクティス)
初学者や小規模な場合
begin
risky_operation
rescue StandardError => e
puts "エラー: #{e.message}"
end
実務・大規模プロジェクトの場合
begin
some_process
rescue ArgumentError => e
# 引数の問題だけ対応
rescue ZeroDivisionError => e
# 数学エラーだけ対応
rescue => e
# その他のStandardError系を最後に
logger.error("予期せぬエラー: #{e.message}")
end
⚠️ Exception は原則使わない!
rescue Exception => e # ❌これは危険(SystemExitも止めてしまう)
JavaScriptとの違い
- JSの
catchは「なんでもキャッチ」 → RubyはStandardErrorのみ(それ以外は 明示的 に) - Rubyではエラーの種類ごとに
rescue を分けて書けるのが強み - Rubyの
Exceptionは JS のcatchに近いけど、基本は避けるのが正解
まとめ
-
Ruby の
rescueはStandardErrorを基準に動いている -
JS の
try...catchとは「捕まえる範囲」が異なる -
一般的には
StandardErrorやその子クラスを指定してrescueするのがベスト -
曖昧な
rescueは避け、目的に応じて 明示的なエラー型を指定する
おわりに
JavaScript に慣れているからこそ、Ruby のエラーハンドリングの 「型による明示的制御」 の考え方は新鮮に映ると思います。
StandardError を正しく使いこなすことで、安全で読みやすい Ruby コードが書けるようになる のでこれからも実務を通し適切な対応ができるように努めたいと思います。