一尘不染

如何有效地使用PHP中的try…catch块

php

我一直在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语句主要仅用于演示目的,但我也使用return,catch()因为我正在对该方法发出AJAX请求,而Javascript期望使用JSON对象,那么如果发生异常,我将返回一个空的JSON编码数组。我只是认为它不会为在示例中添加特定代码带来任何价值。


阅读 310

收藏
2020-05-29

共1个答案

一尘不染

重要的提示

以下讨论假定我们正在讨论的是如上例中所示的结构化代码:无论选择哪种选择,异常都将导致该方法在逻辑上停止执行中间的操作。


只要您打算做同样的事情,无论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"
    }
}
2020-05-29