HTTPレスポンスで、特に失敗の場合のステータスには400番台と500番台があります。
大きく分けて、
- 「呼んだ側が悪い」のが400番台。権限違反から書式違反からいろいろ。
- 「呼ばれた側が悪い」のが500番台。裏方が落ちてるのも何だかわからないけど処理がうまく動かなかったのも。
この分類自体は普遍的と言えます。例えばJavaの例外を検査例外にすべきかどうかは、「呼んだ側が悪い」系だったら注意深いプログラミングで完全に発生を回避できるんだから非検査例外で良いよねと判断すればいい、という話を別記事でまとめたことがあります。
でもこの分類以外にもう一つ、失敗の類型はあるはずなのです。
- 「誰も悪くない」⋯ 同名のユーザーがすでに存在した、など。
ユーザー作成をリクエストする側はリクエストしてみるその瞬間まで同名のユーザーが存在しないかどうかわかりませんし、サーバー側はもちろん粛々と制約に従ってリクエストをはじいただけだから悪くありません。
「どちらが悪い」とかいうと責任のなすりつけあいの話みたいですけど、プログラミング上の実践的な話で言うとリクエスト側は注意深くプログラミングしても避けられず、かといって正常なサーバーから返されうるので正常な処理ルートの一部として処理しないといけない失敗であると言えます。
こういうのに400番台でも500番台でもない、別の名前がほしかった。600番台とかね。
ここでまた例外の話に戻るのですが、アプリケーションプログラミングの世界においても「呼ぶ側が悪かった例外」「呼ばれた側が悪かった例外」に加えて「誰も悪くない例外」が有り得るわけです。よく例外の取り扱いの常識として「正常系の処理フローに例外キャッチを使ってはいけない」というのがありますが、「誰も悪くない例外」はそれに該当しないのではないか、と提言します。