2012-10-10 64 views
2

我用我的PHP應用程序的PDO MySQL驅動程序,並在我的模型之一,我有這樣的:追趕PDO致命的錯誤,引發異常

public function getAllUsers() { 
    $this->st = $this->db->query('SELECT name FROM users'); 
    $this->st->setFetchMode(PDO::FETCH_OBJ); 
    $users = array(); 
    while($row = $this->st->fetch()) { 
     array_push($users, $row->name); 
    } 

    return $users; 
} 

$this->db在數據庫處理從父類繼承。問題是,如果由於某種原因$this->db是不是有效的數據庫對象我得到這個致命的錯誤:

Call to a member function query() on a non-object

,這是可以預期的,但要使它更容易爲我的最終用戶,我不希望讓他們在try-catch塊中包裝方法或做任何錯誤檢查,我想知道如何捕獲致命錯誤並拋出異常(整個應用程序使用異常)。

是否有某種PDO選項使得它僅在這些情況下拋出異常?

編輯:重新閱讀,我應該補充說,我有很多代碼包裝在try-catch塊進一步在繼承樹,所以如果這產生了一個異常,而不是致命的錯誤,我將能夠抓住它並優雅地終止應用程序。

+0

什麼原因會'$這個 - > db'不是一個有效的數據庫對象?如果您正在使用它來獲取此類中的數據,似乎應該保證。爲什麼不首先檢查它,如果它不是一個有效的對象,拋出一個異常說沒有數據庫連接。 – drew010

回答

3

您可以強制PDO拋出一個異常與此

$db = new PDO($dsn, $user, $pass, array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
); 

但我不認爲這將有助於你的情況,因爲它不與PDO它只是null對象的問題有關。

你想做什麼就相當於這個

$a = null; 
$a->query(); 
+0

嗯,好點。只是有時數據庫連接並未初始化,因爲並非所有模型都需要數據庫連接。如果用戶在未加載數據庫連接時嘗試使用此方法,則會通過此錯誤。哦,好吧,看起來我必須先做一些檢查,然後再嘗試設置'$ this-> st'。 –

+0

如果你真的想這樣做,你可以使用神奇的方法,例如'__get' – Rezigned

+0

如果你想把錯誤作爲異常處理,你可以[設置一個全局錯誤處理器](http://php.net/manual/en/class.errorexception.php)。內置的'ErrorException'就是爲了這個目的。 (請參閱鏈接文檔頁面上的示例1。) – alttag