Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDOException类是否继承Exception类?_Php_Database_Pdo_Transactions - Fatal编程技术网

Php PDOException类是否继承Exception类?

Php PDOException类是否继承Exception类?,php,database,pdo,transactions,Php,Database,Pdo,Transactions,我正在编写一个pdo php事务代码,我一直这样编写catch部分: try{ $this->db->beginTransaction(); //Some transaction code $this->db->endTransaction(); } catch(Exception $e){ $this->db->cancelTransaction(); } catch (PDOE

我正在编写一个pdo php事务代码,我一直这样编写catch部分:

try{
        $this->db->beginTransaction();
        //Some transaction code
        $this->db->endTransaction();
    } catch(Exception $e){
        $this->db->cancelTransaction();
    } catch (PDOException $e){
        $this->db->cancelTransaction();
    }

代码运行良好,但我觉得这不符合逻辑。仅仅使用catch(异常$e)并删除catch(异常$e)部分就足够了吗?PDOException类是否继承异常类?

是的,它继承。是的,这不符合逻辑。是的,仅仅使用catch(例外$e)

扩展它就足够了。所以你的代码是不符合逻辑的,第二次捕获永远不会起作用。只要使用
catch(异常$e)
就足够了。但是,如果您希望以不同的方式处理,则需要按照以下方式执行

<?php
    try {
      $this->db->beginTransaction();
      //Some transaction code
      $this->db->endTransaction();

    } catch (PDOException $e) {
      echo "DataBase Error:".$e->getMessage();
    } catch (Exception $e) {
      echo "General Error".$e->getMessage();
    }
    ?>


在异常处理中,您应该尽可能精确
Exception
可以捕获任何类型的异常,对于一个,比方说,
ScriptFailedForSomeRandomReasonUnrelatedToYourDatabase
,取消databasetransaction的错误处理不会有任何好处。延伸,延伸。但正如Franz所说,如果只捕获异常,那么捕获的数量可能会超出预期。@PatrickQ这就是您可能希望回滚事务的原因如果您试图捕获多个异常类型,每个异常类型都有不同的处理方式,那么捕获的顺序很重要。。。。在这种情况下,PDOException扩展了Exception(无论是间接的),您将始终捕获Exception,而不会捕获特定的PDOException。。。。首先是细节,然后是多个catch块的一般异常删除catch for PDOException不会对您发布的代码逻辑产生任何影响,因为PDOException将被catch for Exception捕获,不管怎样,除了愚蠢的echo,您难道不能考虑任何处理场景吗?这样的例子太多了,以至于每一个PHPNoob都认为echo$e->getMessage();这是捕猎的唯一目的。我可以,但这只是一个例子。