状況
決済処理の PR をレビューしている。作成者のコメントは「決済 API のエラーでアプリが落ちないよう try/catch を追加しました」。差分の中心は次のコード。
最も優先して伝えるべき指摘は?
try { await chargePayment(order);} catch (e) { console.log(e); }await markAsPaid(order);正答
- console.log ではなく、ロガーライブラリで出力すべきです
- 変数名 e は、error のように分かりやすくすべきです
- 決済が失敗しても markAsPaid が実行され、未払いが支払済みになります
- try/catch より Promise の .catch() で書くほうが簡潔です
解説
catch で例外をログに出すだけで処理を続けているため、決済が失敗しても次の markAsPaid が実行され、代金を受け取っていない注文が支払済みになる。お金とデータの整合に関わる重大な不具合である。失敗時は処理を中断するか、失敗状態として記録する必要がある。ロガーの使用や変数名、.catch() での書き方は、もっともらしいが好みや改善の範囲で、この不具合を直さない。
この問題を含む 実務シチュエーション のテストを制限時間つきで解く
実務シチュエーションクイズへ