php: поймать исключение PDO и продолжить выполнение?

0

Мой проект с использованием PDO исключительной обработки в db.class.php, который является глобальным файлом для всех библиотек, которые не могут быть изменены из-за воздействия.

В какой-то момент приложение пытается подключиться к новой базе данных, и если новая база данных недоступна, сценарий должен игнорировать эту ошибку и продолжить выполнение.

Новое исключение соединения с БД обрабатывается в "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 );
        }
  • 0
    Вы в пространстве имен? Попробуйте \PDOException в рамках улова.
  • 0
    Нет, это не в пространстве имен ..
Показать ещё 2 комментария
Теги:
exception-handling
pdo

2 ответа

1

Файл db.class.php бросает исключение DbEX которое, вероятно, является тем, которое вы должны ловить, а не общее PDOException.

  • 0
    Я пытался, но даже это тоже не работает ... catch (DbEX $ exx) {// выбросить новое исключение ('Невозможно подключиться'); }
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 );

Я думаю, вам нужно дважды проверить сообщение об ошибке, которое может возникнуть из этого кода.

  • 0
    Пробовал, не работает.
  • 0
    Могу ли я увидеть ваш пользовательский код исключения? «DbEX» а что за сообщение об ошибке?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню