2015-12-21 71 views
1

我有一个处理的对象这样的JSON-RPC处理函数:为什么SQLite3错误不是例外?

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抛出异常?

回答

3

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

+1

将PDO与'$ db-> setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION)一起使用;'工作。 – jcubic