抓住Zend PDO例外

时间:2010-12-03 11:56:26

标签: zend-framework exception pdo try-catch

我想知道我是否可以试一试$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,即使报告错误,我也会看到空白页。

3 个答案:

答案 0 :(得分:2)

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

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

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函数尝试使用参数连接到db,如果失败的话 它会抛出一个Zend_Db_Adapter_Exception,如果成功连接,它将返回PDO object

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

答案 1 :(得分:1)

转到拥有数据库代码的地方,并将try catch放在该代码中。如果您只想要Pdo Exceptions,那么只捕获PdoException。像catch一样(PdoExcetion_OR_What_Its_Name_Is $ e)(并将错误输出禁用到屏幕上。将错误写入日志文件)

答案 2 :(得分:1)

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

但要回答你的问题:

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

这应该只捕获PDO异常。