【问题标题】:Catch Zend PDO Exception捕获 Zend PDO 异常
【发布时间】:2010-12-03 11:56:26
【问题描述】:

我想知道是否可以尝试一下$application->bootstrap()->run();
这将捕获pdo exceptions

这可行,但它会捕获所有我不想要的异常。

try {
    $application->bootstrap()->run();
} catch (Exception $e) {
    print_r($e);
}

我遇到了一个令人讨厌的 pdo 异常被抛出并显示来自 application.ini 的密码的事件!

值得注意的是,我已经尝试过PDOException,它没有被捕获。

我的数据库是在 bootstrap run() 中设置的

    try {
        $db = $this->getPluginResource('db')->getDbAdapter();
        Zend_Registry::set('dbAdapter', $db);
    } catch (Exception $e) {
        echo 1;exit;
    }

请注意,如果我在本地输入错误的密码并运行应用程序,我看不到 1,即使打开错误报告,我也会看到一个空白页。

【问题讨论】:

    标签: zend-framework exception pdo try-catch


    【解决方案1】:

    如果我正确理解了这个问题,这意味着你正试图捕捉你的数据库连接异常

    这就像下面的这些行一样简单:

    try {
        $db = Zend_Db::factory('Pdo_Mysql', $parameters);
        $db->getConnection();
    } catch (Zend_Db_Adapter_Exception $e) {
        // perhaps a failed login credential, or perhaps the RDBMS is not running
    } catch (Zend_Exception $e) {
        // perhaps factory() failed to load the specified Adapter class
    }
    

    基本上getConnection 函数正在尝试使用参数连接到数据库,如果它失败了 它会抛出一个Zend_Db_Adapter_Exception,如果连接成功,它将返回PDO object

    同样,您可以使用此模式在引发此类错误的控制器类或模型中捕获Zend_Db 异常或PDO_Exceptions,但不能捕获整个应用程序

    【讨论】:

    • 这更像是,不幸的是在我的引导运行中,我有 $db = $this->getPluginResource('db')->getDbAdapter();我没有调用 zend db,因此我可以自定义体验以对其进行尝试。
    【解决方案2】:

    转到您拥有数据库代码的地方,然后在该代码周围放置 try catch。如果您只想要 Pdo 异常,则只捕获 PdoException。放置类似 catch(PdoExcetion_OR_What_Its_Name_Is $e) 的内容(并禁用错误输出到屏幕。将错误写入日志文件)

    【讨论】:

    【解决方案3】:

    尝试捕获整个应用程序似乎很奇怪。禁用错误报告(例如 php.ini 中的 display_errors)会更好地停止从未捕获的异常中泄露任何敏感信息。

    但要回答你的问题:

    try {
        $application->bootstrap()->run();
    } catch (PDOException $e) {
        print_r($e);
    }
    

    这应该只捕获 PDO 异常。

    【讨论】:

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