在mysqli中使用try/catch

15

我正在学习一个面向对象的mysqli课程。在连接数据库时,他们使用以下脚本:

$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不应该检测到此错误吗?


1
请添加课程链接。 - Jakub Filipczyk
如果连接文件抛出异常,并且catch块在显示任何异常后终止脚本,我会倾向于同意...但实际上没有任何东西可以清洁地处理任何连接问题,因为脚本将继续执行,无论它是否具有数据库连接。 - Mark Baker
joebezucha,这门课程叫做“使用面向对象的PHP访问数据库”,来自lynda.com。 - cesarcarlos
1
http://www.lynda.com/PHP-tutorials/Accessing-Databases-Object-Oriented-PHP/169106-2.html - cesarcarlos
3个回答

21

如果您需要使用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


2
在代码的第一部分中,当您使用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

谢谢,Kyle。我假设唯一可能发生的错误是由 $db->connect_error 检查到的连接错误。只是想知道在尝试连接数据库时 try/catch 可以检测到哪些其他类型的异常。 - cesarcarlos
当您使用带有异常$e的catch块时,它将捕获抛出的任何异常,即使只是连接异常。我发现这个问题也可能对您有所帮助。https://dev59.com/GGkw5IYBdhLWcg3whK48 - KyleHodgetts
这就是我感到困惑的地方。如果在尝试连接数据库时输入了错误参数(请参见我在帖子中添加的更新),则catch块不会被执行(没有错误被输出)。连接错误不被视为异常吗?谢谢。 - cesarcarlos
1
如果您看到我在另一个问题中发布的链接,关于这种类型的异常,他通过检查条件是否为真,并且如果是,则抛出一个新的异常来被catch块捕获,将两种方法结合起来。请尝试一下。 - KyleHodgetts
谢谢,Kyle!我很感激! - cesarcarlos

-2

你是在询问$db->connect_errortry/catch之间的区别吗?

$db->connect_error主要用于我们已知的错误(用户名不正确等)。

try/catch则是关于系统级别的,一旦出现错误,

PHP将会寻找最近的try/catch块,

一旦它捕获到了异常,PHP将继续执行,就像之前什么都没有发生过一样,

但如果你没有任何try/catch块和set_exception_handler()

PHP将会因为错误而停止。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接