使用 Doctrine\DBAL\Exception 捕获数据库错误
Catch db error with 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;
}
但是,这并不能阻止 concrete5 到 return
网站告知错误,所以,我不想显示该网站,我想在 array()
为了 return 通过 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
谢谢
因为你的 catch
块中有 throw $e
你进一步抛出这个异常,这意味着它(可能)由全局异常监听器处理。一旦你抛出异常,你会立即退出你的代码,所以一个解决方案就是删除 throw $e
行,你应该很好
不要抛出异常。
不是抛出异常,而是从 DBALException $e
对象中获取异常消息 $e->getMessage()
并将其编码为 JSON 字符串。 重要提示: 在 echo
之后放置一个 exit;
以确保不再执行其他代码。
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
我想捕获来自 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;
}
但是,这并不能阻止 concrete5 到 return
网站告知错误,所以,我不想显示该网站,我想在 array()
为了 return 通过 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
谢谢
因为你的 catch
块中有 throw $e
你进一步抛出这个异常,这意味着它(可能)由全局异常监听器处理。一旦你抛出异常,你会立即退出你的代码,所以一个解决方案就是删除 throw $e
行,你应该很好
不要抛出异常。
不是抛出异常,而是从 DBALException $e
对象中获取异常消息 $e->getMessage()
并将其编码为 JSON 字符串。 重要提示: 在 echo
之后放置一个 exit;
以确保不再执行其他代码。
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