Фатальная ошибка при выкидывании исключения в случае неудачного конструирования PDO

Lionishy

Новичок
PHP 5.4.7 под XAMPP 3.1.0 mobile

Следующая конструкция ведёт себя странным образом:

PHP:
try{
    $pdo = new \PDO($dsn,$user,$password,$driverOptions);
} catch(\PDOException $ex) {
    throw new MyException($ex);
}
Если подключиться к базе данных не удаётся, то вместо перехвата исключения вызывающей данный кусок функцией получаю Fatal Error: in .... <номер строки с текстом throw new>

Если подключиться удалось, но, например, ошибочный пароль, то всё работает нормально: выкидывается MyException, которое перехватывается и записывается.

Попытка избавиться от MyException и поймать \PDOException не приводит к желаемому -- проблема остаётся: при провале подключения к базе данных появляется пустой Fatal Error, но указывает уже на строку создания объекта.

Как же быть?

P.S. При замене дистрибутива PHP на 5.3.6 всё неожиданно начинает работать, как предполагается.
Что же это происходит?
 

Фанат

oncle terrible
Команда форума
http://php.net/manual/en/pdo.error-handling.php
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
так у него ж ещё до коннекта. так что если только в опцыях передавать.

Lionishy, а действительно, попробуй в параметры и этот запихнуть?

Если fatal error и правда пустой, то делай репорт о баге.
Скорее там все нормально, просто средний пехопист воспринимает ошибку, как "тётя ругается". А о чём - уже неважно :)
Поэтому считают необязательным и приводить полный текст.
 

Lionishy

Новичок
Fatal Error: пустой. Никакого пояснения, иначе бы я искал в поисковиках по тексту ошибки.
Добавление опции выбрасывания исключений при работе с драйвером не помогает.
Установка дистрибутива 5.4.11 не помогает.
 

Lionishy

Новичок
Обнаружилось, что ошибка возникает только в windows 8.
Обидно, конечно, но скорее всего, это проблема сборки и на уровне PHP не решается.
 

Lionishy

Новичок
Переустановка apache и дистрибутива PHP отдельно от XAMPP не помогла, ошибка сохраняется.
 

AmdY

Пью пиво
Команда форума
Было бы интересно посмотреть на код MyException
 

Lionishy

Новичок
Было бы интересно посмотреть на код MyException
Там нет ничего удивительного... Я просто сократил цепочку наследования до одного названия...

PHP:
\components\pdo\exception\Exception extends \framework\core\exception\ComponentException extends \framework\exception\Exception extends \Exception
При этом к классу \Exception ничего не добавляется.

PHP:
class DerivedException extends BaseException {
};

На самом деле, все эти исключения, показанные мой исключительно из юмористических соображений, не имеют значения.

Ошибка возникает даже просто при попытке создать объект типа \PDO в пустом файле, если нет подключения к базе данных: не отвечает сервер или ошибка в IP адресе.
Может быть это как-то связано с IPv6?
 

Фанат

oncle terrible
Команда форума
стоп. при чем здесь вообще IP адреса? Мы же, вроде, про PDO говорим?
что такое "не отвечает сервер или ошибка в IP адресе"? сообщения об ошибках? можно попросить привести их как есть, а не пересказывать своими словами?
 
  • Like
Реакции: WMix

AmdY

Пью пиво
Команда форума
Lionishy
>>extends \Exception
вот меня и смущает момент, что ты в конструктор передаёте первым аргументом объект PDOException
 

флоппик

promotor fidei
Команда форума
Партнер клуба
стоп. при чем здесь вообще IP адреса? Мы же, вроде, про PDO говорим?
Потому что при попытке соединится с несуществующим хостом по имени выпадет варнинг getaddrinfo(), даже если от PDO ожидаются только исключения.
 

fixxxer

К.О.
Партнер клуба
А если безо всяких MyException, просто throw new \Exception, тоже fatal error?

Если нет - есть идиотское предположение: посмотреть, что делает autoload.
 

Lionishy

Новичок
можно попросить привести их как есть, а не пересказывать своими словами?
Fatal Error: in D:\SiteDev\www\localhost\components\pdo\interfaces\PDOResourceManager.class.php on line 33

вот меня и смущает момент, что ты в конструктор передаёте первым аргументом объект PDOException
Просто в строку преобразуется. По типу Java Object.toString() Всё равно, что $ex->getMessage(). Только тут ещё имя типа исключения сохраняется. Так что текст более информативный получается: PDOException with message '<message goes here>'.

А если безо всяких MyException, просто throw new \Exception, тоже fatal error?
Даже в пустом файле, где есть только $pdo = new \PDO и параметры вбиты руками, а не выгружены из XML.
 

Lionishy

Новичок
Не ясно, что им написать...
Проблема создания \PDO ? Пустой Fatal Error: когда хотелось бы увидеть Uncaught Exception ?
С другой стороны, если я перехвачу \PDOException и подавлю его, то ничего не произойдёт. Даже если я выкину новое сообщение, но при этом не буду обращаться к PDOException в catch блоке. Собственно с этого вопрос и начинался. Что же происходит? Как поправить? Почему я мне приходится поглощать исключение?
 

Вурдалак

Продвинутый новичок
Кстати говоря, а у тебя нет какого-то кастомного обработчика ошибок?
 

Lionishy

Новичок
Я уже много чего попробовал и потерял массу времени.
Совершенно ясно, что никакие собственные исключения и прочее ни при чём.

Буквально из одной строки код ведёт себя не так, как ожидается:
PHP:
$pdo = new \PDO('mysql:host=localhost;dbname=test','user','password');
Вместо того, чтобы выдать Fatal Error Uncaught Exception я получаю пустой Fatal Error.

Однако, следующий код работает так, как ожидается:
PHP:
try {
    $pdo = new \PDO('mysql:host=localhost;dbname=test','user','password');
} catch(\PDOException $ex) {
    throw new \Exception("\PDOException's been caught!");
}
Возникает Fatal Error Uncaught Exception


Но и тут не всё "слава Эслану". Следующий код опять выдаёт пустой Fatal Error:
PHP:
try {
    $pdo = new \PDO('mysql:host=localhost;dbname=test','user','password');
} catch(\PDOException $ex) {
    throw new \Exception($ex->getMessage());
}
И неприятность эта возникает только под Windows 8. Вне зависимости от того какой дистрибутив 5.4.* я ставлю. Windows XP и *nix хостинг с 5.4.8 работают всегда, как ожидается: нормальный Fatal Error Uncaught Exception.


P.S. Всё это я уже отправил в bug report. Moжет быть, когда-нибудь заработает, но сейчас ответ очевиден: не использовать PHP под Windows 8.
 
Сверху