【问题标题】:Try / catch in mysqli在 mysqli 中尝试/捕获
【发布时间】:2015-02-05 08:43:51
【问题描述】:

我正在学习 OOP 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 不应该检测到这个错误吗?

【问题讨论】:

  • 请添加课程链接
  • 如果连接文件抛出异常,并且如果 catch 块在显示任何异常后终止脚本,我倾向于同意....但实际上没有任何东西实际上处理任何连接问题干净,因为无论是否有数据库连接,脚本都会继续执行
  • joebezucha,该课程名为 Accessing Databases with Object-Oriented PHP from lynda.com

标签: php mysqli try-catch


【解决方案1】:

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

    【讨论】:

    • 谢谢,凯尔。我假设唯一可能发生的错误是 $db->connect_error 检查的连接错误。只是想知道尝试连接数据库时 try/catch 可以检测到哪些其他类型的异常。
    • 当你使用带有 Exception $e 的 catch 块时,这将捕获任何抛出的异常,即使它只是连接异常。我发现这个问题也可能对你有用。 stackoverflow.com/questions/9836693/…
    • 这就是我感到困惑的地方。如果我在尝试连接到数据库时输入了错误的参数(请参阅我添加到我的帖子中的更新),则不会执行 catch 块(不会回显错误)。连接错误是否不被视为异常?谢谢
    • 如果您看到我发布到关于此类异常的另一个问题的链接,他通过检查条件是否为真,如果是,则抛出一个新的异常以被捕获捕获块。试试看
    • 谢谢,凯尔!我很感激!
    【解决方案3】:

    您是问$db->connect_errortry/catch 有什么不同吗?

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

    try/catch系统级,一旦出现错误,

    PHP 将搜索最近的 try/catch 块,

    一旦它捕捉到什么东西,PHP 仍然会像以前没有发生过一样继续,

    但如果您没有任何try/catch 块和set_exception_handler() 也,

    PHP 会因错误而停止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-22
      • 2021-08-27
      • 1970-01-01
      • 2019-08-25
      • 2017-09-12
      • 1970-01-01
      • 2010-09-12
      • 2017-09-05
      相关资源
      最近更新 更多