zend框架2没有使用Db适配器捕获PDO异常

时间:2012-10-29 21:56:52

标签: exception pdo try-catch zend-db zend-framework2

我正在使用Zend \ Db \ Adapter \ Adapter来启动PDO_Mysql驱动程序的查询。我想用PDOException类来捕获主键冲突。

以下代码正确捕获异常并显示第一条消息。它基于执行模式的查询方法。

    try {
        $dbAdapter = new DbAdapter(array(
                'driver' => 'Pdo_Mysql', 'database' => 'securedraw',
                'username' => 'root', 'password' => '',));          

        $sql = "INSERT INTO users (mail, password) values('josep', 'josep')";
        $dbAdapter->query($sql, DbAdapter::QUERY_MODE_EXECUTE);

    }catch (\PDOException $e) {
        print "First Message " . $e->getMessage() . "<br/>";
    }catch (\Exception $e) {
        print "Second Message: " . $e->getMessage() . "<br/>";
    }

我不明白,因为这段代码没有捕获它(唯一的变化是它是一个准备好的语句)。

在这种情况下显示第二条消息,它更通用,并且没有说错误是否是主键违规。

    try {
        $dbAdapter = new DbAdapter(array(
                'driver' => 'Pdo_Mysql', 'database' => 'securedraw',
                'username' => 'root', 'password' => '',));          

        $sql = "INSERT INTO users (mail, password) values('josep', 'affsafq')";
        $statement = $dbAdapter->createStatement($sql);
        $statement->execute();  

    }catch (\PDOException $e) {
        print "First Message "   . $e->getMessage() . "<br/>";
    }catch (\Exception $e) {
        print "Second Message: " . $e->getMessage() . "<br/>";
    }

1 个答案:

答案 0 :(得分:2)

你应该检查php手册中的例外

}catch (\Zend\Db\Adapter\ExceptionInterface $e) {
    $message = $e->getPrevious() ? $e->getPrevious()->getMessage() : $e->getMessage();
    print "First Message "   . $message . "<br/>";
}catch (\Exception $e) {
    print "Second Message: " . $e->getMessage() . "<br/>";
}