80

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 ブロックを使用する利点はありますか? または、複数のデータベース トランザクションを同じ try/catch ブロックにグループ化しても問題ありませんか?

try/catch ブロックを入れ子にすることはできますか? ありがとう!

編集

return ステートメントは主にデモンストレーションのみを目的としていましたが、returns in も使用しています。catch()これは、そのメソッドに対して AJAX 要求を行っており、Javascript が JSON オブジェクトを予期しているためです。例外が発生した場合は、空の JSON エンコード配列を返します。 . 私の例に特定のコードを入れても何の価値もないと思っただけです。

4

8 に答える 8

21

後世のために、答えは遅すぎるかもしれません。変数の戻り値を確認して、例外をスローする必要があります。その場合、プログラムは例外が発生した場所から catch ブロックにジャンプすることが保証されます。以下を参照。

try{
   $tableAresults = $dbHandler->doSomethingWithTableA();
   if (!tableAresults) 
     throw new Exception('Problem with tableAresults');

  $tableBresults = $dbHandler->doSomethingElseWithTableB();
   if (!tableBresults) 
     throw new Exception('Problem with tableBresults');
} catch (Exception $e) {
    echo $e->getMessage();

}
于 2014-10-20T23:31:47.060 に答える
10

単一の try catch ブロックの方が読みやすいです。エラーの種類を特定することが重要な場合は、例外をカスタマイズすることをお勧めします。

try {
  $tableAresults = $dbHandler->doSomethingWithTableA();
  $tableBresults = $dbHandler->doSomethingElseWithTableB();
} catch (TableAException $e){
  throw $e;
} catch (Exception $e) {
  throw $e;
}
于 2016-10-19T19:24:43.933 に答える
1
try
{
    $tableAresults = $dbHandler->doSomethingWithTableA();
    if(!tableAresults)
    {
        throw new Exception('Problem with tableAresults');
    }
    $tableBresults = $dbHandler->doSomethingElseWithTableB();
    if(!tableBresults) 
    {
        throw new Exception('Problem with tableBresults');
    }
} catch (Exception $e)
{
    echo $e->getMessage();
}
于 2016-10-19T11:48:44.647 に答える