Это старый вопрос, но есть еще один тонкий способ, которым это сообщение может произойти.Это очень хорошо объяснено здесь, в документах .
Представьте себе это scenerio:
try {
// code that triggers a pdo exception
} catch (Exception $e) {
throw new MyCustomExceptionHandler($e);
}
И MyCustomExceptionHandler
определяется примерно так:
class MyCustomExceptionHandler extends Exception {
public function __construct($e) {
parent::__construct($e->getMessage(), $e->getCode());
}
}
Это фактически вызовет новое исключение в пользовательском обработчике исключений, поскольку класс Exception
ожидает число для второго параметра в своем конструкторе, но PDOException
мог бы динамически изменить тип возвращаемого значения $e->getCode()
наstring.
Обходной путь для этого - определить пользовательский обработчик исключений, например:
class MyCustomExceptionHandler extends Exception {
public function __construct($e) {
parent::__construct($e->getMessage());
$this->code = $e->getCode();
}
}