有没有办法让PDO子对象抛出CustomException而不是PDOException?

时间:2012-03-26 00:21:58

标签: php exception pdo

有没有办法让这样的课程如下:

class DB extends PDO {}

(对于记录只有一个方法(构造函数)重载父方法,以便我们不将任何参数传递给构造函数,我们通过配置文件连接)

能够在任何情况下抛出这样的自定义CustomException

throw new CustomException($e->getMessage(), 500, array($e->...));

$ePDOException的实例,而不是默认的PDOException,而没有将所有方法包装在try-catch块中?

2 个答案:

答案 0 :(得分:3)

不确定代码的类型安全性(键入hints vs duck typing):

您可以编写一个扩展PDO的类,并通过__call魔术方法将其用作委托。在__call()中,您可以捕获实际的PDO异常并将其包装在自定义异常中。所以你仍然需要写一个包装器,但是相当短的包装器。

答案 1 :(得分:1)

您可以在自己的方法中抛出自定义异常。因此,如果您在扩展类中编写了每个PDO方法,并使它们看起来像这样:

public function query($statement) {
    try {
        parent::query($statement);
    } catch (PDOException $exception) {
        throw new CustomException(whatever you want to do here);
    }
}

这样,只要PDO抛出PDO异常,它就会捕获异常并抛出自己的自定义异常。但是你必须记住,PDO使用其他一些类,比如PDOStatement,它可以创建自己的PDOExceptions,你也可以覆盖它们。您可以通过PDO的方法参数将其用作语句类。