エラー処理とは?失敗に優雅に対処する
エラー処理とは、プログラムが予測不能にクラッシュする代わりに、回復または優雅に失敗できるよう、失敗を予期し、検出し、応答する方法です。
物事はうまくいかないものです。ファイルは欠け、ネットワークは切れ、入力は不正な形になります。エラー処理とは、そうした失敗を見込み、それに対して何をするかを決める規律です。リトライ、フォールバック、報告、あるいはクリーンな終了を行い、プログラムをクラッシュさせたり、もっと悪くデータを黙って壊させたりしないようにします。良いエラー処理こそが、脆いコードと堅牢なソフトウェアを分けるものです。
エラーを扱う方法
- エラーのロジックをハッピーパスから分けるtry/catchによる例外。
- 呼び出し側が明示的に検査せねばならないエラー戻り値。
- コンパイル時に処理を強制するResult型やOption型。
- 一時的で回復可能な失敗に対するbackoff付きのリトライ。
静かにではなく、大声で失敗せよ
最悪のエラー処理は、エラーを飲み込んで何事もなかったかのように続けることで、これはバグを隠し状態を壊します。良い処理は、意味ある回復をするか失敗を明確に表面化させるかであり、決して静かに無視しません。
一時的なエラー vs 恒久的なエラー
一部の失敗は一時的(一瞬のネットワークの乱れ)でリトライの価値があり、他は恒久的(不正な入力)でリトライは時間の無駄です。この2つを区別することが中核です。回復可能なものはリトライし、残りは速やかに失敗させます。
優雅な劣化
堅牢なシステムは優雅に劣化します。重要でないサービスが失敗しても、アプリは完全に崩壊する代わりに縮小した機能で続きます。エラー処理は、どの失敗が致命的で、どれが許容できるかを決めます。
手短な例
ネットワーク呼び出しをbackoff付きのリトライで包むと一時的な乱れを自動で処理し、数回の試行の後も呼び出しが失敗し続ける場合は明確なエラーが送出されます。
CIにおけるエラー処理
CIは2つの理由でfailします。本物のバグ(決定論的、修正すべき)と、一時的なインフラの不調(flakyなネットワークやregistry、リトライすべき)です。Latchkeyはまさにこのロジックを適用し、ネットワークの乱れやOOM killのような一時的な失敗を自動でリトライしつつ、本物のエラーは修正されるようfailさせます。
重要なポイント
- エラー処理は、プログラムが優雅に劣化するよう失敗を予期し応答する。
- エラーを決して黙って飲み込まない: 意味ある回復をするか、明確に表面化させる。
- 一時的な失敗と恒久的な失敗を区別することが、リトライか修正かを決める。