有没有办法让这样的课程如下:
class DB extends PDO {}
(对于记录只有一个方法(构造函数)重载父方法,以便我们不将任何参数传递给构造函数,我们通过配置文件连接)
能够在任何情况下抛出这样的自定义CustomException
:
throw new CustomException($e->getMessage(), 500, array($e->...));
$e
是PDOException
的实例,而不是默认的PDOException
,而没有将所有方法包装在try-catch块中?
答案 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的方法参数将其用作语句类。