1

在一个 try-catch 块中使用例如两个查询是否有效?

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

两者都是完全有效的。正如其他人所说,这一切都与用例有关。

我唯一要补充的是,您可能还想使用事务。这样,如果例如第二个查询失败,您就可以回滚。请注意,这也取决于用例。

于 2013-01-22T10:58:24.460 回答
2

两种方法都被接受,但第一种更具可读性。一个try catch用于同一组功能就足够了。

如果您的一个调用失败,它将停止 bloc 执行并直接转到catch,因此将所有调用都放在相同的try工作中。

我怀疑在第二种方式中,编译器可能会将两个catchs 中的代码识别为相同并将其优化为第一个,但应该尝试一下。

于 2013-01-22T10:53:47.530 回答
2

如果您根据哪个命令失败需要不同的行为,那么您需要将每个(对)命令包装在它们自己的try/catch块中。

如果您担心的只是任何一行发生的一些错误,那么您可以将所有命令包装在一起并以相同的方式处理所有异常。

于 2013-01-22T10:54:39.020 回答
1

我会说尽可能使用单个 try-catch 块。如果您的第二个查询取决于第一个查询的成功,那么如果第一个查询引发异常,则不会执行第二个查询。
在我看来,一系列的 try-catch 块并不构成可读性很强的代码。一个相当大的 try-catch 是可以的,只要你不去所有 pokemon 风格(必须全部抓住它们)......我的意思是在一个 try-block 中执行 5 个查询是可以的,但是当您正在处理同一块中每个查询的结果,您做得太过分了。

如果您想知道哪种方法最有效: -blocks 由抛出catch的类的实例触发。Exceptioncatch 块内的代码预计会处理该错误,因此脚本不必完全失败,并且可以恢复正常服务。
如果您使用多个 try-catch 块,则该代码片段可能会引发多个Exception实例(PDOException在本例中)。然而“小”开销是,创建一个新实例不是免费的。如果在骑行结束时您仍想向用户展示成功查询的数据并显示未成功检索某些数据的通知,则需要多次尝试捕获,如果您想显示一切,或什么都没有,使用 1 个 try-catch 块,并使用 Exception 实例来计算失败的查询并向用户显示适当的错误消息(或者只是告诉他们这一切都出错了)

于 2013-01-22T11:08:25.933 回答
1

你的道具是什么,这有点不同。如果一个查询是相互依赖的,那么它们应该在 try-catch 中。如果没有,如果您不需要对方的数据,并且如果您认为页面可以在没有第一次 try-catch 的信息的情况下继续运行,那么您可以继续查询。

至少我是这样认为的。

于 2013-01-22T10:54:25.950 回答