1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【 Ruby / JavaScript 】例外処理の違いと StandardError の正しい使い方

Posted at

はじめに

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の rescueStandardError をデフォルトで捕まえる設計なので、明示しても 省略しても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 の rescueStandardError を基準に動いている

  • JS の try...catch とは「捕まえる範囲」が異なる

  • 一般的には StandardError やその子クラスを指定して rescue するのがベスト

  • 曖昧な rescue は避け、目的に応じて 明示的なエラー型を指定する

おわりに

JavaScript に慣れているからこそ、Ruby のエラーハンドリングの 「型による明示的制御」 の考え方は新鮮に映ると思います。

StandardError を正しく使いこなすことで、安全で読みやすい Ruby コードが書けるようになる のでこれからも実務を通し適切な対応ができるように努めたいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?