2012-03-26 100 views
2

有没有一种方法,使一类这样的这一个:有没有办法让PDO子对象抛出CustomException而不是PDOException?

class DB extends PDO {} 

(其中备案只有一个方法(构造函数)重载父之一,所以我们没有传递参数的构造和我们连接经由配置文件)

能够在任何情况下抛出定制CustomException这样的:

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

$e作为PDOException occurre的一个实例d,而不是默认PDOException,没有包装try-catch块中的所有方法?

+0

这是什么原因? – Niko 2012-03-26 11:17:54

+0

@尼科,漫长而漂亮的故事。我必须有一个集中的CustomException,它应该覆盖我的应用程序将抛出的所有异常。相信我。在使用之前,我必须将PDOException s转换为CustomException s,之后我不能这样做;不,我不能将PDO的错误模式设置为正常的PHP错误,并将它们视为正常警告。 – Shoe 2012-03-26 11:20:04

+0

如果您需要在某个时候捕获所有异常,您可能需要考虑在那里使用catch(Exception $ e)'。捕获PDOExceptions以及CustomExceptions。 – Niko 2012-03-26 11:23:26

回答

3

不知道如何类型安全的代码必须是(类型提示VS鸭打字):

你可以写一个类,它不扩展PDO并通过__call魔术方法使用它作为代表。在__call()内部,您可以捕获实际的PDO异常并将其包装在您的自定义异常中。所以你仍然需要编写一个包装,但是很短。

+0

PDOStatement怎么样,我该如何管理?我们还必须覆盖这些方法...... – Shoe 2012-03-26 11:16:07

+0

您可以用一个__call()包装器覆盖prepare()并返回一个多个委托对象。您是否考虑过在上层的某个时刻捕获PDOException并将其作为CustomException包装/重新抛出? – tweber 2012-03-26 11:34:49

+0

是的,我做了,它不是一个选项。可以设置PDOStatement的扩展名,但它必须是PDOStatement的子项,所以__call()将不起作用。我会管理别的东西。如果你有一个想法让我知道:) – Shoe 2012-03-26 11:51:24

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,它可以创建它自己的PDOException,您也可以覆盖它。你可以通过PDO的方法参数作为你的语句类。

+0

我也会在自己的方法中包装抛出异常,然后调用它以便稍后编辑。 – dqhendricks 2012-03-26 02:49:12

+0

-1没有彻底读取问题 - *“没有包装try-catch块中的所有方法”。* – FtDRbwLXw6 2012-03-26 03:45:59

+0

@drrcknlsn他可能意味着在使用类的实例时不必包装每个方法调用,而不是已知覆盖每个方法的选项以在类的方法中放置一个try catch块... – dqhendricks 2012-03-26 04:19:22

相关问题