1

たとえば、1つのtry-catchブロックで2つのクエリを使用することは有効ですか?

try
{
   $query1 = prepare("SELECT * FROM tbl1...");
   $query2 = prepare("SELECT * FROM tbl2...");
   $query1 = execute();
   $query2 = execute();
}catch (PDOException $e)
{
   print "Error!: " . $e->getMessage();
   return false;
}

または、次のようになります。

try
{
   $query1 = prepare("SELECT * FROM tbl1...");
   $query1 = execute();
}catch (PDOException $e)
{
   print "Error!: " . $e->getMessage();
   return false;
}


try
{
   $query2 = prepare("SELECT * FROM tbl2...");
   $query2 = execute();
}catch (PDOException $e)
{
   print "Error!: " . $e->getMessage();
   return false;
}

両方の方法が受け入れられ、使用されている場合、それらの間に違いはありますか?(速度?)インデックスでさらにクエリを実行する必要があるが、すべてを分離したくないため

4

5 に答える 5

2

どちらも完全に有効です。他の人が述べているように、それはすべてユースケースに関するものです。

私がそれに追加したい唯一のことは、あなたがトランザクションを使用したいかもしれないということです。そうすれば、たとえば2番目のクエリが失敗した場合にロールバックできます。これはユースケースにも依存することに注意してください。

于 2013-01-22T10:58:24.460 に答える
2

どちらの方法も受け入れられますが、最初の方法の方が読みやすいです。関数の同じグループに対して1 つtry catchで十分です。

呼び出しの 1 つが失敗すると、ブロックの実行が停止され、直接 に移動するcatchため、すべて同じようにtry機能します。

2 番目の方法では、コンパイラが 2 つcatchの s のコードを同一であると認識し、最初の s として最適化する可能性があると思われますが、これは試してみる必要があります。

于 2013-01-22T10:53:47.530 に答える
2

失敗したコマンドに応じて異なる動作が必要な場合は、コマンドの各 (ペア) を独自のtry/catchブロックにラップする必要があります。

どこかの行で発生するエラーだけが心配な場合は、すべてのコマンドをまとめてラップし、すべての例外を同じように処理できます。

于 2013-01-22T10:54:39.020 に答える
1

可能な限り単一の try-catch ブロックを使用することをお勧めします。2 番目のクエリが最初のクエリの成功に依存している場合、最初のクエリが例外をスローすると、2 番目のクエリは実行されません。
私の目には、一連の try-catch ブロックは非常に読みやすいコードにはなりません。あなたがすべてのポケモンスタイルに行かない限り、かなりのサイズのtry-catchは問題ありません(すべてを捕まえる必要があります)... つまり、1つのtry-block内で5つのクエリを実行しても問題ありませんが、同じブロックで各クエリの結果を処理しているので、やりすぎです。

どれが最も効率的なアプローチか疑問に思っている場合:ブロックは、スローされるクラスcatchのインスタンスによってトリガーされます。Exceptioncatch ブロック内のコードはそのエラーを処理することが期待されているため、スクリプトが完全に失敗する必要はなく、通常のサービスを再開できます。
複数の try-catch ブロックを使用すると、コードのスニペットが複数のExceptionインスタンスをスローする可能性があります (PDOExceptionこの場合)。ただし「マイナー」オーバーヘッドは、新しいインスタンスの作成が無料ではないことです。ライドの最後に、成功したクエリのデータをユーザーに表示し、一部のデータが正常に取得されなかったという通知を表示したい場合は、複数の try-catch が必要です。すべてまたは何もない場合、1 つの try-catch ブロックを使用し、例外インスタンスを使用して失敗したクエリを特定し、ユーザーに適切なエラー メッセージを表示します (または、すべてが間違っていることを伝えます)。

于 2013-01-22T11:08:25.933 に答える
1

それはあなたの提案が何であるかが異なります。1 つのクエリが相互に依存している場合は、try-catch を使用する必要があります。そうでない場合、他のデータを必要とせず、最初の try-catch の情報がなくてもページが進むと思われる場合は、クエリを続行できます。

少なくとも私はこのように考えています。

于 2013-01-22T10:54:25.950 に答える