1. ホーム
  2. php

[解決済み] PHPでtry...catchブロックを効率的に使用する方法

2023-08-23 15:32:05

質問

PHPのコードでtry..catchブロックを使用していますが、正しく使用できているかどうかわかりません。

例えば、私のコードの一部は以下のようになります。

 try {
      $tableAresults = $dbHandler->doSomethingWithTableA();
      $tableBresults = $dbHandler->doSomethingElseWithTableB();
 } catch (Exception $e) {
      return $e;
 }

複数のデータベース操作を同じtry/catchブロックにまとめているのは、いずれかのトランザクションで例外が発生した場合に、それを処理できるようにするためです。

よりも可読性が高く効率的だと思うので、そのようにしているのです。

 try {
       $tableAresults = $dbHandler->doSomethingWithTableA();
 } catch (Exception $e) {
       return $e;
 }
 try {
       $tableBresults = $dbHandler->doSomethingWithTableB();
 } catch (Exception $e) {
       return $e;
 }

とはいえ、私がやっていることが良い習慣なのか、それとも例外をキャッチするための怠惰な方法なのかは分かりませんが。

私の仮定では、例外が特別な処理を必要とする場合のみ、それ自身のトライ/キャッチブロックが必要で、それ以外は同じトライ/キャッチでそれらをグループ化しても問題ないはずです。

そこで私の質問です。

データベーストランザクションごとにtry/catchブロックを使用する利点はありますか? それとも、同じtry/catchブロックで複数のデータベーストランザクションをグループ化しても、まったく問題ないでしょうか?

try/catch ブロックのネストは大丈夫でしょうか? ありがとうございます。

EDIT

return文は主にデモンストレーションのためだけでしたが、returnを使った catch() を使用していますが、これはそのメソッドに AJAX リクエストを行い、Javascript が JSON オブジェクトを期待しているためで、例外が発生した場合は、空の JSON エンコード配列を返します。私の例では、特定のコードを置くことに何の価値もないだろうと思っただけです。

どのように解決するのですか?

重要なお知らせ

以下の議論は、上記の例のように構造化されたコードについて話していることを前提としています。どちらの選択肢を選んだとしても、例外が発生すると、メソッドは論理的にそれが途中であったとしても停止します。


のどのステートメントを使っても同じことをするつもりである限りは、例外は発生しません。 try ブロックのどの文が例外を投げても同じことをするつもりであれば、確かに単一の try / catch . 例えば

function createCar()
{
    try {
      install_engine();
      install_brakes();
    } catch (Exception $e) {
        die("I could not create a car");
    }
}

複数 try / catch ブロックは、失敗を正確に引き起こしたものに特化した方法で処理することができ、またそのつもりである場合に便利です。

function makeCocktail()
{
    try {
        pour_ingredients();
        stir();
    } catch (Exception $e) {
        die("I could not make you a cocktail");
    }

    try {
        put_decorative_umbrella();
    } catch (Exception $e) {
        echo "We 're out of umbrellas, but the drink itself is fine"
    }
}