Исключения в PDO...

MiksIr

miksir@home:~$
PDOException extends RuntimeException
RuntimeException extends Exception

Но в Exception: protected int $code ;
а в PDOException: protected string $code ;

А еще смотрим на конструктор public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]] )

И как результат:
catch (PDOException $e ) { throw new PDOException($e->getMessage(), $e->getCode()); }
Вызывает фатал.

Равно как и любой другой throw new ... наследованный от Exception

=(
 

Ragazzo

TDD interested
эм, а зачем ты так делаешь?
PHP:
catch (PDOException $e ) { throw new PDOException($e->getMessage(), $e->getCode()); }
а не просто бросаешь $e?
Кстати немного не понял насчет
Равно как и любой другой throw new ... наследованный от Exception
кидаю в Yii CException от Exception, все ок, или ты именно про PDO?
 

MiksIr

miksir@home:~$
Да именно про PDO - он возвращает строку в $e->getCode(), а Exception хочет int. В итоге фатал.

> а не просто бросаешь $e?
Ну это я упростил для наглядности, на самом деле бросаю свое исключение.
 

MiksIr

miksir@home:~$
Пытаюсь научить PDO реконктица если соединение с базой потеряно... это, блин, адская пляска...
 

MiksIr

miksir@home:~$
Хочется сохранить у конструктора такой же интерфейс, что и у Exception. В общем понятно, что можно выкрутится, особо учитывая 3-й параметр у Exception который в 5.3 появился вроде. Но это все грязно и некрасиво =(

Да и у человека там другая проблема, ныне не актуальная - PDOException->getCode() прекрасно возвращает код ошибки.

... А еще понять не могу, чего это getCode() сделан final...
 

Ragazzo

TDD interested
MiksIr
.. А еще понять не могу, чего это getCode() сделан final...
скорее всего чтобы не переопределяли и было строгое соответствие кодов ошибок возвращаемых с документацией. Хотя там впринципе все final кроме __toString конечно.
 

MiksIr

miksir@home:~$
Да вот ничего не мешает в свойство code записать чего хотим , и геттер будет давать то, что мы туда записали.
 

Ragazzo

TDD interested
MiksIr
Ну да, вообщем хз :) это надо спрашивать у разработчиков) с другой стороны всегда единый формат всех методов чтобы ты не сделал.
 
Сверху