我在使用ZF2和DbAdapter时出现问题。
我正在制作一个select语句,并在发生错误时尝试异常。
我在块中的select语句尝试... 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();
}
答案 0 :(得分:0)
Reivaldo,欢迎来到stackoverflow!
由于Zend DB驱动程序使用自定义语句实例,PDO抛出的异常和其他可能的错误在内部处理,并在必要时转换为Zend\Db\Adapter\Exception
个实例。
查看this example。
不要在代码中捕获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.
}
您可能还想阅读一些关于exception handling的文档。