【问题标题】:Catch exception when on PDO connection在 PDO 连接时捕获异常
【发布时间】:2014-07-05 11:24:21
【问题描述】:

我使用 PDO 建立了以下连接。显然它不会连接,因为我没有指定主机或数据库(或用户或密码)

$dbh = new PDO('mysql:host=;dbname=', '', '');

..那么我该如何捕捉异常呢?我正在尝试这样的事情:

try {
  $dbh = new PDO('mysql:host=;dbname=', '', '');
} catch (Exception $e) {
  echo 'Error: ',  $e->getMessage(), "\n";
}

.. 但没有消息显示。为什么?

【问题讨论】:

  • 尝试在打开连接后立即添加$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  • 如果没有在连接字符串中指定任何内容,PDO 将不会尝试连接任何内容,因此也不例外。在连接字符串中放入任何内容,您将看到您的异常。
  • 如果你想捕捉 PDO execption 然后捕捉 PDOException 而不是 Exception.. 有意义吗?

标签: php pdo


【解决方案1】:

您是否使用自定义命名空间?那么你需要改变

} catch (\Exception $e) {
  echo 'Error: ',  $e->getMessage(), "\n";
}

注意异常之前的反斜杠。

【讨论】:

  • -1 他使用的回显语法是正确的。 (php.net/echo) 并且异常命名空间是 ROOT 所以你不需要斜杠
  • @John 你错了And the exception namespace is ROOT so you do not need the slash。如果代码在自定义命名空间的上下文中运行,则需要使用 \ 来寻址全局命名空间。
  • 他使用的命名空间在哪里?他没有用一个。您也可以说他的数据库名称为“”,用户为“”,密码为“”。这是一个无法回答问题的幻像解决方案
  • @John 您希望该代码 sn-p 中的命名空间声明在哪里?代码可能确实在自定义命名空间中运行,但 OP 忘记提及
【解决方案2】:

您需要传递属性ERRMODE_EXCEPTION 以便在连接尝试失败时接收异常:

$dbh = new PDO('mysql:host=;dbname=', '', '', array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
));

查看PDO::__construct() 的手册页了解更多信息。

也请查看@Ali 的回答!

【讨论】:

    猜你喜欢
    • 2012-05-20
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 2011-10-27
    相关资源
    最近更新 更多