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.