【问题标题】:Catching PDO fatal error and throwing exception [duplicate]捕获 PDO 致命错误并抛出异常 [重复]
【发布时间】:2012-10-01 05:44:26
【问题描述】:

我在我的 PHP 应用程序中使用 PDO MySQL 驱动程序,在我的一个模型中我有这个:

public function getAllUsers() {
    $this->st = $this->db->query('SELECT name FROM users');
    $this->st->setFetchMode(PDO::FETCH_OBJ);
    $users = array();
    while($row = $this->st->fetch()) {
        array_push($users, $row->name);
    }

    return $users;
}

$this->db 是继承自父类的数据库句柄。问题是,如果出于某种原因 $this->db 不是有效的数据库对象,我会收到此致命错误:

在非对象上调用成员函数 query()

这是意料之中的,但为了让我的最终用户更容易,我不想让他们将方法包装在 try-catch 块中或进行任何错误检查,我想知道如何才能捕捉到它致命错误并引发异常(整个应用程序都使用异常)。

是否有某种 PDO 选项使其仅在此类情况下抛出异常?

编辑:重新阅读,我应该补充一点,我有很多代码包装在继承树中的 try-catch 块中,所以如果这产生异常而不是致命错误,我将能够捕获它并优雅地终止应用程序。

【问题讨论】:

  • $this->db 不是有效数据库对象的原因是什么?如果您使用它来获取此类中的数据,似乎应该保证这一点。为什么不先检查它,如果它不是一个有效的对象,抛出一个异常说没有数据库连接。

标签: php mysql exception pdo


【解决方案1】:

你可以用这个强制 PDO 抛出异常

$db = new PDO($dsn, $user, $pass, array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
);

但我认为这对您的情况没有帮助,因为它与 PDO 无关,它只是 null 对象问题。

你想要做的就是这个

$a = null;
$a->query();

【讨论】:

  • 嗯,好点子。只是有时数据库连接没有初始化,因为并非所有模型都需要数据库连接。如果用户在未加载数据库连接时尝试使用此方法,则会出现此错误。哦,好吧,看来我在尝试设置 $this->st 之前必须做一些检查。
  • 如果你真的想这样做,你可以使用魔法方法,例如__get
  • 如果您希望将错误作为异常处理,您可以set a global error handler。内置的ErrorException 就是为此目的。 (请参阅链接文档页面上的示例 #1。)
猜你喜欢
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 2022-01-17
  • 2014-08-26
  • 1970-01-01
相关资源
最近更新 更多