为什么SQLite3错误不是例外


Why SQLite3 errors are not exceptions?

我有JSON-RPC处理程序函数,可以处理像这样的对象:

class Service {
    public function sqlite_query($token, $filename, $query) {
        if (!$this->valid_token($token)) {
            throw new Exception("Access Denied: Invalid Token");
        }
        $db = new SQLite($filename);
        $res = $db->query($query);
        if ($res) {
            if (preg_match("/^'s*INSERT|UPDATE|DELETE|ALTER|CREATE/i", $query)) {
                return $db->rowAffected();
            } else {
                return $res->fetchAll();
            }
        } else {
            throw new Error("Coudn't open file");
        }
    }
}

SQLite是一个调用SQLite 2或3的类。代码捕获所有异常,但当我尝试执行无效SQL时,我得到的不是异常,而是由以下代码处理的php错误:

set_error_handler('error_handler');
ini_set('display_errors', 1);
ini_set('track_errors', 1);
ob_start();
function error_handler($err, $message, $file, $line) {
    global $stop;
    $stop = true;
    $content = explode("'n", file_get_contents($file));
    header('Content-Type: application/json');
    $id = extract_id();
    $error = array(
       "code" => 100,
       "message" => "Server error",
       "error" => array(
          "name" => "PHPErorr",
          "code" => $err,
          "message" => $message,
          "file" => $file,
          "at" => $line,
          "line" => $content[$line-1]));
    ob_end_clean();
    echo response(null, $id, $error);
    exit();
}

有没有办法让SQLite抛出异常?

是的,使用PHP的PDO访问SQLite3(而不是SQLite函数)。PDO可以说是访问任何数据库(包括SQLite3)的最佳方式,也是目前的标准和首选方式。通过在实例化PDO对象时指定'PDO::ATTR_ERRMODE => 'PDO::ERRMODE_EXCEPTION,可以使PDO抛出异常。