2012-03-26 94 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

相關問題