2014-12-07 80 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