Php PDOException类是否继承Exception类?
我正在编写一个pdo php事务代码,我一直这样编写catch部分: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
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();这是捕猎的唯一目的。我可以,但这只是一个例子。