使用Doctrine \ DBAL \ Exception捕获db错误

时间:2016-08-10 21:19:59

标签: database symfony exception doctrine-orm concrete5-5.7

我想从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

谢谢

2 个答案:

答案 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">&times;</a>

        <div id="session_error_msg">
            <?php  print $m ?>
        </div>
    </div>
<?php 
}
$session->remove('error');
?>
//html