php:捕获PDO异常并继续执行?

时间:2018-04-09 07:17:14

标签: php mysql pdo exception-handling

我的项目在'db.class.php'中使用PDO异常处理,这是所有库的全局文件,由于影响而无法更改。

在某些时候,应用程序正在尝试连接新数据库,如果无法访问新数据库,则脚本应忽略此错误并继续执行。

新的数据库连接异常在'db.class.php'中处理,当我在连接新数据库时尝试处理异常时,异常处理不起作用,脚本在此时停止。

如果我在连接到新数据库时没有处理异常,在这种情况下脚本也会停止执行。

要求即使DB在这种情况下由于任何问题没有连接,脚本应该继续执行而忽略错误。

代码:

try {   
        $newDb = new DB(DB_HOST_new, DB_NAME_new, DB_USER_new, DB_PASS_new, DB_UTC_TIMEZONE);
        $isDbSsConnected = true ;
    } catch (PDOException $exx)  {          
        //throw new Exception('Unable to connect');
    }

db.class.php

try {
            $connection = new PDO( $dsn, $username, $password );
            $connection->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

            if ( $utc ) {
                $this->setUtc( $connection );
            }

            $this->connection = $connection;
            self::$connections[$dsn][$username] = self::$connectionCachingEnabled ? $this->connection : NULL;

        } catch ( PDOException $ex ) {
            throw new DbEx( "Initialize Failed: DSN = " . $dsn, DbEx::INIT_FAILED, $ex );
        }

2 个答案:

答案 0 :(得分:1)

db.class.php文件正在抛出DbEX异常,这可能是您应该捕获的异常,而不是通用PDOException

答案 1 :(得分:0)

假设这是您的自定义异常名称DbEx

/**
 * Define a custom exception class
 */
class DbEx extends Exception
{
}

然后你有DB类

class DB
{
    public function __construct($host, $name, $username, $password, $timezone)
    {
        $dsn = "mysql:host=$host;dbname=$name";
        $username = $username;
        $password = $password;
        $utc = $timezone;

        try {
            $connection = new PDO( $dsn, $username, $password );
            $connection->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
        } catch ( PDOException $ex ) {
            throw new DbEx("Initialize Failed: DSN");
        }
    }
}

现在您有一个页面/文件,您将从类DB

调用该连接
try {   
    $newDb = new DB('localhost', 'test', 'root', '', true);
    $isDbSsConnected = true ;
} catch (DbEx $exx)  {          
    // catch error from DB class
    echo "script should go here ignoring the error";
}

上面的代码可以作为您的要求,但是,您的代码在此部分

throw new DbEx( "Initialize Failed: DSN = " . $dsn, DbEx::INIT_FAILED, $ex );

我认为您需要仔细检查错误消息可能来自此代码本身。