dongqie2010 2015-01-11 14:25
浏览 104
已采纳

如何扩展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?

  • 写回答

1条回答 默认 最新

  • dph19153 2015-01-11 14:32
    关注

    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.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line