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
11

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

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