
「動く」コードと「落ちない」コードは違う
「動く」コードと「落ちない」コードは違う
プログラミング学習中に
- APIが
応答しない - ユーザーが
想定外の 値を 入力する - データベースへの
接続が 切れる - 外部
サービスが メンテナンス中
こうした
エラーハンドリングの基本原則
原則1:エラーを握りつぶさない
最もやりがちな
エラーを
エラーを
- ログに
記録する - ユーザーに
エラーメッセージを 表示する - 上位の
処理に エラーを 再スローする
原則2:ユーザーにシステムエラーの詳細を見せない
エラーの
| 場面 | 悪い例 | 良い例 |
|---|---|---|
| DB接続エラー | Error: ECONNREFUSED 127.0.0.1:5432 | 「ただいまサーバーに |
| 認証エラー | Error: Invalid password for user admin | 「メールアドレスまたは |
| 入力エラー | TypeError: Cannot read property 'length' of undefined | 「名前を |
原則3:エラーの種類を区別する
すべての
- バリデーションエラー — ユーザーに
修正方法を 具体的に 伝える - 認証・認可エラー — ログインページへリダイレクトする
- サーバーエラー — ユーザーには
一般的な メッセージを 表示し、 エンジニアには 詳細ログを 記録する - ネットワークエラー — リトライの
仕組みを 提供する
本番で
フロントエンドのエラーハンドリング
API通信のエラーハンドリング
フロントエンドから
考慮すべきケース:
- ネットワークエラー — ユーザーが
オフラインのとき - タイムアウト — APIの
応答が 遅い とき - ステータスコードエラー — 400系、500系の
レスポンス - レスポンスの
パース失敗 — JSONではないレスポンスが 返ってきた とき
UIでのエラー表示
- インラインエラー — フォームの
入力欄の 横に エラーメッセージを 表示する - トースト通知 — 一時的な
エラーを 画面の 隅に 表示する - エラーページ — 致命的な
エラー時に 専用の エラーページを 表示する - エラーバウンダリ — Reactの
エラーバウンダリで、 コンポーネントの クラッシュを キャッチする
バックエンドのエラーハンドリング
ログの設計
本番環境では、console.logではなく構造化された
ログに
- タイムスタンプ
- エラーの
種類・メッセージ - リクエストの
情報 (URL、 パラメータ、 ユーザーID) - スタックトレース
- 重要度
(info、warn、error)
外部サービスとの連携
本番環境では、
| サービス | 用途 |
|---|---|
| Sentry | エラートラッキング。 |
| Datadog | インフラ・アプリケーションの |
| CloudWatch | AWSの |
未経験エンジニアがやりがちなエラーハンドリングのミス
1. すべてのエラーに同じメッセージを表示する
「エラーが
2. ハッピーパスしかテストしない
正常系だけでなく、異常系の
- 空の
値を 送信したら どうなるか - 存在しない
IDを 指定したら どうなるか - 権限のない
ユーザーが アクセスしたら どうなるか
3. リトライの仕組みがない
一時的な
エラーハンドリングは「ユーザーへの誠実さ」
エラーハンドリングを
ゆめさくエンジニアの
読みやすい
コードレビューで
Webエンジニアの
XSS・CSRF・SQLインジェクションを
現場で
スクールでは
ゆめさくエンジニアの
18ヶ月で




