Codeigniter 3:使用try catch块无法捕获数据库错误

时间:2017-01-18 09:53:55

标签: php codeigniter-3

我正在处理api,它处理来自客户端的请求,然后从服务器获取响应(使用codeigniter 3开发)并将其转发回客户端。

但是,如果出现任何数据库错误(如重复ID或空值),则模型类无法处理该错误以显示正确的错误消息。我已经尝试过try catch块但尚未成功。 这是模型:

public function add() {
    try {
        $this->db->trans_start(FALSE);
        $this->db->insert('users', $preparedData);
        $this->db->trans_complete();
        if ($this->db->trans_status() === FALSE) {
            throw new Exception("Database error:");
            return false;
        }
        return TRUE;
    } catch (Exception $e) {
        log_message('error: ',$e->getMessage());
        return;
    }
}

有一点需要注意,我已将db_debug设置为FALSE。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

对于CI 3,下面的代码获取数据库错误代码错误消息。 db_debug设置为FALSE。

public function add() {
    try {
        $this->db->trans_start(FALSE);
        $this->db->insert('users', $preparedData);
        $this->db->trans_complete();

        // documentation at
        // https://www.codeigniter.com/userguide3/database/queries.html#handling-errors
        // says; "the error() method will return an array containing its code and message"
        $db_error = $this->db->error();
        if (!empty($db_error)) {
            throw new Exception('Database error! Error Code [' . $db_error['code'] . '] Error: ' . $db_error['message']);
            return false; // unreachable retrun statement !!!
        }
        return TRUE;
    } catch (Exception $e) {
        // this will not catch DB related errors. But it will include them, because this is more general. 
        log_message('error: ',$e->getMessage());
        return;
    }
}

请参阅https://www.codeigniter.com/userguide3/database/queries.html#handling-errors

上的文档

  

如果您需要获取最后发生的错误,error()方法将返回数组,其中包含代码消息

我认为这有点不完整,因为它在示例代码中没有显示错误代码和错误消息。

答案 1 :(得分:0)

以上代码中的建议

  • 删除行@Autowired

  • 如果我们在完成交易后看到@RunWith(SpringRunner.class) @SpringBootTest(classes=Application.class) public class ServiceTest { @Autowired Service service; @Autowired Environment environment; @Test public void testServiceGetProperty() { assertEquals(environment.getProperty("prop"), service.getProperty("prop"); } } ,它将始终为空

  • 删除分号-$this->db->trans_complete();

$this->db->error()