【问题标题】:php: catch PDO exception and continue execution?php:捕获 PDO 异常并继续执行?
【发布时间】:2018-04-09 07:17:14
【问题描述】:

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

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

新的数据库连接异常在“db.class.php”中处理,当我在连接新数据库时尝试处理异常时,异常处理无法正常工作,脚本在此时停止。

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

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

代码:

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

【问题讨论】:

  • 您在命名空间中吗?在 catch 中尝试\PDOException
  • 不,它不在命名空间内..
  • 缓存通用异常怎么样? catch (Exception $e) { // 做事 }
  • 也尝试过通用异常处理,但奇怪的是它也不起作用......

标签: php mysql pdo exception-handling


【解决方案1】:

db.class.php 文件引发了 DbEX 异常,这可能是您应该捕获的异常,而不是通用的 PDOException

【讨论】:

  • 我试过了,但即使这样也不起作用... catch (DbEX $exx) { //throw new Exception('Unable to connect'); }
【解决方案2】:

假设这是您的自定义异常名称 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 );

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

【讨论】:

  • 我可以看看您的自定义异常代码吗? “DbEX”和错误信息是什么?
  • 如果您还可以在您的问题上添加您的类 DbEx 代码,它会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多