如何有效地使用尝试...在 PHP 中捕获块

2022-08-30 08:21:22

我一直在使用尝试..在我的PHP代码中捕获块,但我不确定我是否正确使用它们。

例如,我的一些代码看起来像这样:

 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块中,而完全没有问题?

可以嵌套尝试/捕获块吗?谢谢!

编辑

return 语句主要用于演示目的,但我也使用 returns,因为我正在向该方法发出 AJAX 请求,并且 Javascript 需要一个 JSON 对象,然后如果发生异常,我将返回一个空的 JSON 编码数组。我只是认为在我的示例中放置特定代码不会增加任何价值。catch()


答案 1

重要提示

下面的讨论假设我们正在讨论的代码结构如上面的示例所示:无论选择哪种替代方法,异常都会导致方法在逻辑上停止执行其中间的任何操作。


只要你打算做同样的事情,无论块中的哪个语句引发异常,那么使用单个 /当然更好。例如:trytrycatch

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

如果您可以并且打算以特定于确切原因的方式处理故障,则多个/块很有用。trycatch

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"
    }
}

答案 2

为了子孙后代,答案可能为时已晚。您应该检查变量的返回值并引发异常。在这种情况下,您可以放心,程序将从引发异常的位置跳转到 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();

}

推荐