如何扩展PDOexception?

I write:

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;
    }
}

Then:

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();
        }
    }
    ...

And if, for example, password is incorrect I receive:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [1045] Access denied...

What I am doing wrong?

You extended the exception correctly but this does not ensure that code that is using a different exception is now using your custom exception simply because you extended it. The PDO class will always throw a PDOException, simply because the code instructs PHP to do so.

<?php

class PDOException extends \Exception {}

class PDO {

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

}

class MyPDOException extends \PDOException {}

As you can clearly see, the PDO class will never throw MyPDOException, since it is using PDOException (hard coded). Of course you could work around this by doing:

<?php

class MyPDO extends \PDO {

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

 }

But this makes no sense at all if you are not doing anything else than converting the exception to another exception.


This is very basic stuff. Consider reading a book or a website on learning object oriented programming in PHP or any other OO programming language.