2014-12-07 88 views
2

我正在關注OOP mysqli課程。當連接到數據庫時,他們使用下面的腳本:Try/catch in PHP

$db = new mysqli("host", "user", "password", "database"); 
if ($db->connect_error){ 
    $error = $db->connect_error; 
    echo("Not connected: " . $error); 
} 

後來雖然,他們調用數據庫連接文件用try/catch塊:

try { 
    require_once "connection.php"; 
}catch (Exception $e){ 
    $error = $e->getMessage(); 
    echo $error; 
} 

是不是可能連接錯誤是嘗試連接後立即由連接文件處理? try/catch塊基本上是做同樣的事情嗎?或者try/catch塊尋找不同類型的錯誤?

更新:只是爲了澄清,在閱讀一些答案後。當我只是這樣做:

try { 
    $db = new mysqli("host", "user", "password", "database"); 
}catch (Exception $e){ 
    $error = $e->getMessage(); 
    echo $error; 
} 

假設數據庫訪問的數據是錯誤的(例如錯誤的主機),我得到一個PHP警告,但不是在catch塊的錯誤輸出。 catch不應該檢測到這個錯誤嗎?

+0

請加鏈接到課程 – 2014-12-07 17:21:49

+0

如果連接文件被拋出一個異常,如果catch塊終止顯示任何異常後的劇本,我會傾向於同意....但在現實中沒有實際處理任何連接問題乾淨,因爲腳本會繼續執行g無論是否有數據庫連接 – 2014-12-07 17:26:21

+0

joebezucha,該課程被稱爲從lynda.com訪問數據庫與面向對象的PHP – cesarcarlos 2014-12-07 17:54:28

回答

1

在代碼的第一部分中,當您使用if語句時,您將檢查是否有一個條件爲真,然後輸出消息。

一個try catch塊基本上是這樣的

try{ 
    //place code here that could potentially throw an exception 
} 
catch(Exception $e) 
{ 
    //We will catch ANY exception that the try block will throw 

} 

所以你看,雖然你的if語句檢查您所期待的條件,在try catch塊會檢測到任何差錯,即使是那些你沒有預料到的事情。 因此,在調試的時候,你可以改變在catch塊中的代碼來處理異常,你認爲合適

查看PHP文檔有關異常 http://php.net/manual/en/language.exceptions.php

+0

謝謝,凱爾。我認爲可能發生的唯一錯誤是由$ db-> connect_error檢查的連接錯誤。想知道嘗試連接數據庫時try/catch可以檢測到其他類型的異常。 – cesarcarlos 2014-12-07 17:31:07

+0

當您使用異常$ E中的catch塊,這將捕獲時引發任何異常,即使它只是連接異常。我發現這個問題對你也有一些用處。 http://stackoverflow.com/questions/9836693/how-to-use-throw-exception-in-mysql-database-connect – KyleHodgetts 2014-12-07 17:34:22

+0

這就是我感到困惑。如果我嘗試連接到數據庫時輸入錯誤的參數(請參閱我加入到我的帖子更新),不執行catch塊(沒有錯誤是呼應)。連接錯誤是否被視爲異常?謝謝 – cesarcarlos 2014-12-07 18:00:11

0

你問什麼是與$db->connect_error不同的更多信息和try/catch

$db->connect_error大多對此我們已經知道

try/catch錯誤(用戶名不正確等)約爲系統級,一旦發生錯誤,

PHP將尋找最近的try/catch塊,

一旦抓到的東西,PHP還是會繼續像沒事發生過,

,但如果你沒有任何try/catch區塊和set_exception_handler()也是,

PHP只會因錯誤而停止。

0

如果需要使用try/catch塊捉對mysqli擴展例外,試試這個代碼(開關異常模式,而不是經典的錯誤報告):

// Method 1: 
$driver = new mysqli_driver(); 
$driver->report_mode = MYSQLI_REPORT_STRICT | MYSQLI_REPORT_ERROR; 

// OR Method 2: 
mysqli_report(MYSQLI_REPORT_STRICT | MYSQLI_REPORT_ALL); 

try { 
    $db = new mysqli("host", "user", "password", "database"); 
} catch (mysqli_sql_exception $e) { 
    ... 
} 

mysqli_sql_exception mysqli_driver