【JS応用|豆知識】なぜ「とりあえずcatch」が危険なのか?エラーハンドリングの新しい流儀

フロントエンド開発において、try-catchブロックをなんとなく設置し、中身をconsole.errorで済ませていないでしょうか。実は、この「とりあえずの握りつぶし」が、将来のバグ調査を困難にする大きな要因となります。今回は、単なるエラー検知を超えた、堅牢なエラーハンドリングについてお話しします。

エラーを「分類」して投げる

多くのエンジニアは、JavaScriptの標準のErrorオブジェクトをそのままthrowします。しかし、これではキャッチ側で「ネットワークエラーなのか」「バリデーションエラーなのか」を判別できません。

例えば、カスタムエラークラスを定義し、エラーの種類を明確にしましょう。

class ValidationError extends Error { name = ‘ValidationError’; }
class NetworkError extends Error { name = ‘NetworkError’; }

このように定義することで、catchブロック内でinstanceofを使い、エラーの種類に応じたユーザーへのフィードバック(警告表示や再試行の提示)を出し分けることが可能になります。

「握りつぶし」を避けるための大原則

最も避けるべきは、catchブロック内で何もしないことです。エラーが発生した事実を捨ててしまうと、UI上では「何も起きない」という最悪のUXが生まれます。

もしエラーをキャッチしたなら、最低限「エラーの再スロー(re-throw)」を検討してください。呼び出し元のさらに上位、例えばReactのErrorBoundaryや、グローバルなエラーハンドラへ委譲することで、アプリケーション全体で一貫したエラー表示を行えます。

非同期処理での「投げっぱなし」に注意

Promiseベースの処理でthrowを忘れると、未処理のPromise拒否(Unhandled Promise Rejection)が発生し、アプリが不安定な状態のまま動作を続けてしまいます。async/awaitを使う際は、必ずtry-catchで囲むか、.catch()で処理を完結させる癖をつけましょう。

エラーハンドリングは、単なるバグ除けではありません。「予期せぬ事態が起きたときに、ユーザーにどう振る舞ってほしいか」を設計する重要なUIの一部です。今日から、エラーを「ただの失敗」ではなく「次に進むための情報」として扱ってみませんか。

タイトルとURLをコピーしました