Upgrade to Pro — share decks privately, control downloads, hide ads and more …

エラーを定義から消し去る

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for shinaps shinaps
April 01, 2026
6

 エラーを定義から消し去る

Avatar for shinaps

shinaps

April 01, 2026

Transcript

  1. 例外が多すぎる 不必要な例外の増殖 「検出するエラーが多いほど良い」
 → 過剰に防御的なスタイル きれいに処理する方法を見つける代わりに、 例外をスローして問題を呼び出し元に丸投げ 呼び出し元も何をすべきかわからない可能性 が高い 著者自身の失敗:Tclのunsetコマンド

    unset(変数の削除)で、変数が存在しない場合にエ ラーをスロー → クリーンアップで存在しない変数も削除したいケー スが頻発 → 開発者はcatch文で囲んでエラーを無視するコード を書く羽目に 例外はインターフェースの一部。不必要な例外はクラスを浅くする 6 / 24
  2. エラーを定義から消し去る 例外処理の複雑さを排除する最善の方法は、処理すべき例外がないようにAPIを定義すること 変更前:unset = 変数を削除する xが存在しない → エラー! 変数が存在しない場合、仕事を遂行 できない

    例外を生成する「意味がある」よう に見える 変更後:unset = 変数が存在しないことを保証する xが存在しない → 作業は完了済み。OK 存在しない変数でunsetを呼ぶのは問題ない 報告すべきエラーケースが存在しない 操作のセマンティクス(意味・定義)をわずかに変更するだけで 例外条件を消し去ることができる 9 / 24
  3. 例:WindowsとUnixのファイル削除 Windows:使用中のファイルは削 除不可 プロセスが開いているファイルは削 除できない → ユーザーがプロセスを探して強 制終了 → 最悪の場合、システムを再起動

    Unix:削除を遅延させてエラーを消す ファイルが開かれている状態で削除 → ファイルに削除マークを付け、削除操作は成功を返す → 既存プロセスは引き続き読み書き可能 → すべてのプロセスがファイルを閉じたらデータを解放 Unixは2種類の例外を定義から消し去った 「削除操作のエラー」と「使用中ファイルの削除による既存プロセスへの例外」 10 / 24
  4. リストAPIと404エラー あるAPIの設計で起きたこと 実際の実装 要素が0件 → 404 Not Found を返す フロント側で404をキャッチして空リスト

    表示に変換するコードが必要に あるべき設計 要素が0件 → 200 OK + `[]` を返す フロント側は配列の長さだけ見ればよい エラー処理が不要に 「該当データがない」はエラーではなく空集合という正当な結果 数学的にも自然な定義 12 / 24
  5. 例外のマスキング 例外的な条件をシステムの低いレベルで検出・処理し、上位レベルに見せない TCPのパケットロス処理 パケットがドロップ TCP層が検出・再送 クライアントはドロップを認識しない クライアントはパケットロスを意識する
 必要がない NFSのサーバー障害処理 NFSサーバーがダウン

    クライアントがリクエストを再発行 サーバー復帰後にシームレスに再開 アプリケーションはエラー処理コードが一切不要 マスキングはインターフェースを縮小し、機能を追加する → より深いクラスをもたらす 14 / 24
  6. キュー処理とマスキング AIサービスでのファイル処理フロー システム側の責任 処理の流れ ユーザーがファイルをアップロード キューにジョブをディスパッチ 202 Accepted を返す ここでユーザーの手を離れる

    システム側で処理を完遂 API呼び出し失敗 → リトライ 一時的な障害 → 待って再実行 ユーザーには処理完了だけを通知 やってはいけないこと 「APIエラーが発生しました」をユーザーに返す → ユーザーにはどうしようもできない TCPがパケットロスをマスキングするように キューワーカーが一時的なエラーをマスキングする 15 / 24
  7. 入口での集約(Zod + OpenAPI) スキーマ定義でバリデーションを一元化 スキーマなし:
 各ハンドラ内で`if (!id) return 400`のような 個別チェックが散在

    スキーマあり: バリデーションはスキーマ定義に一元化 ハンドラはビジネスロジックに集中 18 / 24
  8. まとめ 本章から 4つの技法 例外処理はソフトウェアにおける
 複雑さの最悪の源泉の一つ 例外処理コードは本質的に書くのが難しく
 テストも困難 不必要な例外の定義が問題をさらに
 悪化させる 例外を処理しなければならない箇所の数を


    減らすことが鍵 エラーを定義から消し去る
 APIの意味・定義を見直すのが最善 例外のマスキング
 低レベルで処理して上位に見せない 例外の集約
 複数の例外を1箇所でまとめて処理 クラッシュさせるだけ
 回復不要なエラーは対応を中止する 例外を見つけたとき「どう処理するか」の前に 「この例外は本当に必要か」と問う 24 / 24