db = new PDO("mysql:h-6ren">
gpt4 book ai didi

php - 错误 "Uncaught PDOException",即使我使用 try-catch

转载 作者:行者123 更新时间:2023-11-29 04:34:55 29 4
gpt4 key购买 nike

我正在使用 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;
}

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

Fatal error: Uncaught PDOException: SQLSTATE[HY000] [1044] Access denied for user 'user' to database 'db' in .....

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

为什么 catch 没有捕获到这个异常?

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

感谢任何帮助。

最佳答案

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

采用以下代码:

<?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。这样它就知道要查看类的全局范围,而不是当前的 namespace 。

关于php - 错误 "Uncaught PDOException",即使我使用 try-catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45584450/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com