【问题标题】:Is it posible to use PDOException in other scope?是否可以在其他范围内使用 PDOException ?
【发布时间】:2013-06-02 13:37:26
【问题描述】:

我正在类构造函数中创建新的 PDO 连接,然后仅在该类中使用它。如果发生一些错误,我会得到致命错误而不是PDOException

致命错误:带有消息的未捕获异常“PDOException” 'SQLSTATE[42S22]: 列不存在.....

我的代码是:

class Helper
{
    private $_db;

    function __construct($config = FALSE)
    {

        $this->_db = new PDO($config['database']['dsn'], $config['database']['username'], $config['database']['password'], $config['database']['options']);
        $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
}

$config = array(
    'database' => array(
        'dsn' => 'mysql:host='.$dbhost.';dbname='.$dbname,
        'username' => $dblogin,
        'password' => $dbpass,
        'options' => array(
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
        )
    )
);

try {
    $helper = new Helper($config);
} catch (PDOException $error) {
    die('Database Error: ' . $error->getMessage());
}

那么有可能吗?

【问题讨论】:

  • 应该是可以的。 PDO 正在使用该功能(以及其他功能)来宣传自己。
  • @11684 但正如我所说 - 我得到的只是致命错误
  • 也许这与您自己没有调用__construct() 方法有关。如果将代码从构造函数移动到实例方法(例如foo),然后在 try 块中执行此操作:$helper = new Helper(); $helper->foo($config),会发生什么情况。
  • 这个 Helper 类的目的是什么?是数据库助手还是别的什么?
  • @11684 我在构造函数中还有其他异常,例如InvalidArgumentException,如果配置为空,它可以正常工作。

标签: php exception pdo


【解决方案1】:

那么有可能吗?

当然。这实际上就是异常的目的。

我得到致命错误而不是 PDOException。

这并不完全正确。你实际上得到了一个异常,虽然没有被捕获(这反过来会导致致命错误)。

关于您当前的错误 - 很可能是由其他代码块引起的。总是有一个带有异常的堆栈跟踪 - 因此,您可以轻松找到它。到时候你就可以抓到了。

但是,我建议不要手动捕获它。最好创建一个异常处理程序并在一个地方捕获所有异常(除非您想以某种方式处理错误,这很少发生)

【讨论】:

  • 问题是我定义了异常,但它触发为未定义Uncaught exception 'PDOException'
  • 所以我需要修复它并捕获该异常
  • 好吧 - 抓住它。顺便说一句,你为什么想要它?很少需要捕获 PDO 错误。
猜你喜欢
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多