如何扩展PDOexception?

时间:2015-01-11 14:25:11

标签: php pdo

我写道:

class MyPDOException extends PDOException{
    protected $_errorMsg;

    public function getErrorMsg(){

        $this->_errorMsg  =
                'Error: ' . $this->getMessage() . '<br />' .
                'File: ' . $this->getFile() . '<br />' .
                'Line: ' . $this->getLine(). '<br/>';

        return $this->_errorMsg;
    }
}

然后:

class DB{
    protected $_db;

    const DB_HOST = 'localhost';
    const DB_NAME = 'ws';
    const DB_USER = 'root';
    const DB_PASSWORD = 'homedb';

    public function __construct(){
        try{
            $this->_db = new PDO("mysql:host=" . self::DB_HOST . 
            ";dbname=" . self::DB_NAME, self::DB_USER , self::DB_PASSWORD);

            $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        catch (MyPDOException $e){
            $e->getErrorMsg();
        }
    }
    ...

例如,如果密码不正确,我会收到:

  

致命错误:未捕获的异常&#39; PDOException&#39;与消息   &#39; SQLSTATE [HY000] [1045]拒绝访问...

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您正确地扩展了异常,但这并不能确保使用不同异常的代码现在只是因为您对它进行了扩展而使用了自定义异常。 PDO类将始终抛出PDOException,因为代码指示PHP这样做。

<?php

class PDOException extends \Exception {}

class PDO {

    public function __construct() {
        // code ...
        // code ...
        if ($error) {
            throw new \PDOException();
        }
    }

}

class MyPDOException extends \PDOException {}

正如您可以清楚地看到的那样,PDO类永远不会抛出MyPDOException,因为它正在使用PDOException(硬编码)。当然,您可以通过以下方式解决此问题:

<?php

class MyPDO extends \PDO {

    public function __construct() {
        try {
            parent::__construct();
        } catch (\PDOException $e) {
            throw new \MyPDOException($e->getMessage(), (int) $e->getCode(), $e);
        }
    }

 }

但如果除了将异常转换为另一个异常之外没有做任何其他事情,这根本没有意义。


这是非常基本的东西。考虑阅读有关使用PHP或任何其他OO编程语言学习面向对象编程的书籍或网站。