Мой проект с использованием 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 );
}
Файл db.class.php
бросает исключение DbEX
которое, вероятно, является тем, которое вы должны ловить, а не общее PDOException
.
Предполагая, что это ваше собственное имя исключения 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 );
Я думаю, вам нужно дважды проверить сообщение об ошибке, которое может возникнуть из этого кода.
\PDOException
в рамках улова.