Поймать ошибку БД с Doctrine\DBAL\Exception
Я хочу поймать любую ошибку (т.е. ошибка внешнего ключа) от insert
заявление или любое другое. Как я могу достичь этого с use Doctrine\DBAL\Exception
?
У меня есть это, когда я делаю insert
:
$db->beginTransaction();
try {
$db->insert('bbc5.produccionpry',$datos);
$datos['propryid'] = $db->lastInsertId();
$db->commit();
// $db = null;
$resp[] = $datos;
} catch (Exception $e) {
$error = array_merge($error, array('error' => $e->errorInfo()));
$db->rollback();
throw $e;
}
Но это не мешает бетону return
веб-сайт, рассказывающий об ошибке, поэтому я не хочу, чтобы этот веб-сайт показывался, я хочу уловить ошибку в array()
чтобы вернуть его через echo json_encode($error)
Я не использую контроллер для страницы, я использую его для управления вызовами RESTful из моего приложения JavaScript с этим кодом:
return fetch(`/scamp/index.php/batchprodpry/${maq}`, {
method: 'POST',
credentials: 'same-origin',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(this.state.a)
})
Я использую ReactJS
Спасибо
2 ответа
Не бросай исключения.
Вместо того чтобы генерировать исключение, просто получите сообщение об исключении $e->getMessage()
от DBALException $e
объект и закодировать его в виде строки JSON. Важно: положить exit;
после echo
чтобы гарантировать, что дальнейший код не выполняется.
use Doctrine\DBAL\DBALException;
try {
$db->insert('bbc5.produccionpry',$datos);
$datos['propryid'] = $db->lastInsertId();
$db->commit();
$resp[] = $datos;
}
catch(DBALException $e){
$db->rollback();
echo \Core::make('helper/json')->encode($e->getMessage());
exit;
}
Если этот код находится внутри контроллера страницы, вы можете сделать это:
try {
$db->insert('bbc5.produccionpry',$datos);
$datos['propryid'] = $db->lastInsertId();
$db->commit();
$resp[] = $datos;
}
catch(DBALException $e){
$this->error->add($e->getMessage());
}
if($this->error->has()) {
// All variables that have been set in the view() method will be set again.
// That is why we call the view method again
$this->view();
return;
}
А concrete5 позаботится об отображении соответствующего сообщения об ошибке.
Или вы могли бы сохранить $e->getMesssage()
в сеансе и вызвать его внутри представления:
$session = \Core::make('session');
// ...
catch(Exception $e){
$session->set('error', $e->getMessage());
}
И в представлении:
// html
<?php
$session = \Core::make('session');
if($session->has('error')) {
$m = $session->get('error');
?>
<div id="session_error" class="alert alert-danger">
<a href="#" class="close">×</a>
<div id="session_error_msg">
<?php print $m ?>
</div>
</div>
<?php
}
$session->remove('error');
?>
//html
Так как у вас есть throw $e
в вашем catch
Если вы бросите это исключение дальше, это означает, что оно (вероятно) обрабатывается глобальным прослушивателем исключений. После того, как вы выбросили исключение, вы немедленно выходите из своего кода, поэтому решение для вас просто удалить throw $e
линия, и вы должны быть хорошими