如何扩展 PDOexception?

How to extend PDOexception?

我写:

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

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

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

我做错了什么?

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

<?php

class PDOException extends \Exception {}

class PDO {

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

}

class MyPDOException extends \PDOException {}

如您所见,PDO class 永远不会抛出 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 编程语言学习面向对象编程的书籍或网站。