错误"未捕获的PDOException",即使我使用try-catch

时间:2017-08-09 07:40:17

标签: php mysql pdo

我使用PDO连接到mySQL数据库。当登录错误时,即使我使用了try-catch,也会给出整个堆栈跟踪错误。

try
{
    $this->db = new PDO("mysql:host='host' dbname='db' charset=utf8", $username, $password);        

    // Tried both with and without these attributes
    $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}
catch(PDOException $e)
{
    echo "Database connection error: " . $e->getMessage());
    exit;
}

运行此代码时 - 使用不存在的数据库名称 - 我收到以下错误:

  

致命错误:未捕获的PDOException:SQLSTATE [HY000] [1044]   用户'用户访问被拒绝到数据库' db'在......

打印出所有信息。如果登录中出现一些错误,我只希望代码退出并将消息写入日志文件。

为什么 catch 没有捕获此异常?

我在Windows计算机上使用本地Apache服务器。也许这是由于一些错误的配置造成的?

感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

您收到此错误是因为您在命名空间中运行代码。

请使用以下代码:

<?php

namespace foo\bar;

// This PDOException has the full class name \foo\bar\PDOException 
// because it's created in a namespace
class PDOException extends \Exception {} // Just so PHP won't throw an error

$exception1 = new PDOException('foo'); // Referencing the local namespace (foo\bar)
$exception2 = new \PDOException('foo'); // Referencing the global namespace
//                ^ -- The backslash means we are refering to the global namespace

var_dump(get_class($exception1)); // string(20) "foo\bar\PDOException" - local scope
var_dump(get_class($exception2)); // string(12) "PDOException" - global scope

DEMO

正如您所看到的那样,如果我们在命名空间中 并且不使用反斜杠添加我们的全局类,那么它会自动假设您引用的类是一个子类。相同的命名空间。

<强>解决方案

因此,您需要使用\PDOException而不是PDOException。这样它就知道要查看类的全局范围而不是当前命名空间。