質問: PHPで例外処理を書いているのですが、 どのように書くのが良いか悩んでいます。 例えば、以下のCode1とCode2ではどちらのほうが良いでしょうか? Code1では、メインの関数とは別の関数内でthrowして、 それをメインの関数でcatchしています。 Code2では、メインの関数で別の関数からの結果を受け取って、 メインの関数内でthrowしています。 エラーハンドリングのコードを書き慣れてないので、 その他、このように書くのが良いなどあればお教えいただければ助かります。 ###### Code1 ``` class Checkout { public function main() { try { $this->saveOrder(); $this->saveOrderDetail(); // ... } catch (Exception $e) { // 例外処理 } } public function saveOrder() { // ... if (Order::save()) { throw new \Exception('注文の保存に失敗'); } } // ... } ``` ###### Code2 ``` class Checkout { public function main() { try { if ($this->saveOrder()) { throw new \Exception('注文の保存に失敗'); } if ($this->saveOrderDetail()) { throw new \Exception('注文詳細の保存に失敗'); } // ... } catch (Exception $e) { // 例外処理 } } public function saveOrder() { // ... return Order::save(); } // ... } ```
回答: 基本的にはCode1の方がいいと思います。 エラーによって、普通ではない状態が発生したわけなので、その時点で処理を中断して、呼び出し元に例外を返して上げるべきです。 また、例外のスタックトレースに、最初にエラーが発生したコードが記録できる点でもCode1の方がよいでしょう。 ※ただし、Order::save())が失敗するケースが、例外的ではなく、正常系でも発生するのであれば、Code2の方がいいかもしれません。(とはいえ、呼び出し元でthrowするのであれば、やっぱり例外的なケースだと思うので、Code1が正しいのかも)