尝试/捕获mysqli

ces*_*los 5 php mysqli try-catch

我正在学习OOP mysqli课程。连接到数据库时,他们使用以下脚本:

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

不过,稍后,他们使用try / catch块调用数据库连接文件:

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

尝试连接后,连接文件不是立即处理了可能的连接错误吗?try / catch块基本上在做同样的事情吗?还是try / catch块正在寻找其他类型的错误?

更新:为了澄清,在阅读了一些答案之后。当我这样做时:

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

假设数据库访问数据是错误的(例如错误的主机),我会收到PHP警告,但catch块中不会输出错误。捕获是否应该检测到此错误?

Dmi*_*tin 8

如果您需要使用 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) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

mysqli_sql_exception mysqli_driver


Kyl*_*tts 3

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

}
Run Code Online (Sandbox Code Playgroud)

因此,您会发现,当您的 if 语句检查您预期的条件时,try catch 块将检测到任何出错的情况,甚至是您未预料到的情况。因此,在调试时,您可以更改 catch 块中的代码来处理您认为合适的异常

有关异常的更多信息,请参阅 PHP 文档 http://php.net/manual/en/language.exceptions.php