У меня проблема с ZF2 и DbAdapter.
Я делаю инструкцию select и пытаюсь получить исключение, когда произойдет некоторая ошибка.
У меня есть оператор select внутри блока try... catch... но проблема в том, что когда я устанавливаю "неправильный запрос", исключение не выбрасывается.
Здесь мое обслуживание:
return array(
'db' => [
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=my_dbname;host=localhost',
'username' => 'root',
'password' => 'root',
'driver_options' => [
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'',
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]
],
'service_manager' => array(
'factories' => array(
'Zend\Db\Adapter\Adapter' => function ($serviceManager) {
$adapterFactory = new Zend\Db\Adapter\AdapterServiceFactory();
$adapter = $adapterFactory->createService($serviceManager);
\Zend\Db\TableGateway\Feature\GlobalAdapterFeature::setStaticAdapter($adapter);
return $adapter;
}
),
),
);
Здесь мой запрос:
try {
$db = $this->getServiceLocator()->get('Zend\Db\Adapter\Adapter');
$sql = "SELECT * FROM 'table'";
$statement = $db->query($sql);
$res = $statement->execute();
} catch (PDOException $e) {
echo $e->getMessage();
}
Reivaldo, добро пожаловать в stackoverflow!
Поскольку драйверы Zend DB используют пользовательские экземпляры инструкций, исключения, вызванные PDO, и другие возможные ошибки, обрабатываемые внутренне, и при необходимости конвертируются в экземпляры Zend\Db\Adapter\Exception
.
Проверьте этот пример.
Вместо того, чтобы ловить PDOException
в вашем коде, всегда улавливайте возможные исключения от наиболее специфического до самого общего. Это хорошая практика.
Например:
try {
// code to throw exceptions
} catch (\Zend\Db\Adapter\Exception $e) {
echo $e->getMessage();
} catch (\Exception $e) {
// This is not an adapter exception, anyway its an exception.
echo $e->getMessage();
} finally {
// This block always executed, an exception thrown or not.
}
Вы также можете прочитать некоторую документацию об обработке исключений.