我想从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)
我没有将控制器用于某个页面,我使用它来管理来自我的JavaScript应用程序的RESTful调用,并使用以下代码:
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
谢谢
答案 0 :(得分:3)
由于throw $e
块中有catch
,因此您进一步抛出此异常,这意味着它(可能)由全局异常侦听器处理。一旦你抛出异常,你立即退出代码,所以解决方案就是删除throw $e
行,你应该很好
答案 1 :(得分: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