try catch块中未捕获的错误

时间:2017-02-21 09:07:48

标签: php mysql

我正在尝试编写“通用”函数来执行SQL查询并返回JSON并处理错误。在过程中有一些我不明白的东西 - 为什么尝试catch块不能处理错误。 (稍后我会改进逻辑 - 问题不在于此,而是纯粹关于错误处理)。

这是我的代码:

public
function sqlToJSON($query, $type = array(), $params = array())
{
    try {
        $data = array();
        $stmt = $this->mysqli->prepare($query);
        if (count($type) > 0 && count($params) > 0) {
            call_user_func_array(array($stmt, "bind_param"), array_merge(array($type), $params));
        }
        $stmt->execute();
        $result = $stmt->get_result();
        while ($row = $result->fetch_assoc()) {
            $data[] = $row;
        }
        $stmt->free_result();
        $stmt->close();
        return array('result' => 'success', 'error' => null, 'data' => $data);
    } catch (Exception $e) {
        $this->sqlError = 'Caught exception: ' . $e->getMessage();
        return array('result' => 'failed', 'error' => $e->getMessage(), 'data' => null);
    }
}

我如何称呼此功能:

    $q = 'INSERT INTO receivers (receiver_name, owner) VALUES (UPPER(?), ?)';
    $params = array(&$receiverName, &$clientEmail);
    $this->sqlToJSON($q, 'ss', $params);

这会产生以下预期的错误:

Uncaught Error: Call to a member function fetch_assoc() on boolean in ...

我不明白为什么在这种情况下不执行catch块?

1 个答案:

答案 0 :(得分:3)

在php中,错误不是例外。如果你想捕获它们,请编写自己的error_handler。 http://php.net/manual/en/function.set-error-handler.php