2014-03-31 136 views
0

當我試圖用database->Select測試我的try-catch塊時,我期待在嘗試回顯PDO語句時捕獲異常,但它告訴我錯誤未被捕獲。php嘗試捕獲不捕獲異常

Catchable fatal error: Object of class PDOStatement could not be converted to string

我不明白我在做什麼錯在這裏。

下面是代碼:

class database{ 

    private $conn; 
    private $sqlError; 

    public function __construct() { 
     $server = "localhost"; 
     $username = "user"; 
     $pass = "password"; 
     $database = 'dbname'; 
     $dsn = sprintf('mysql:dbname=%s;host=%s', $database, $server); 
     try { 
      $this->conn = new PDO($dsn, $username, $pass); 
     } catch (Exception $exc) { 
      $this->sqlError = 'SQL Error: ' . $exc->getCode(); 
     } 
    } 

    public function Select($query, $values=array()) { 
     unset($this->sqlError); 
     try { 
      $qry = $this->conn->prepare('select ' . $query); 
      echo $qry; //invalid operation, I expect exception to be thrown 
      $qry->execute($values); 
      $result = $qry->fetchAll(PDO::FETCH_OBJ); 
      $error = $qry->errorInfo(); 
      if ($error[1]) { 
       $this->sqlError = 'SQL Error: ' . $error[1]; 
      } 
      return $result; 
     } catch (Exception $exc) { 
      $this->sqlError = 'SQL Error: ' . $exc->getCode(); 
     } 
    } 


} 

回答

1

Catchable Fatal Error也不例外,它是一個錯誤。它不能被try/catch塊捕獲,而是被自定義錯誤處理程序捕獲。有關更多信息,請參閱this answer

這條線:

echo $qry; //invalid operation, I expect exception to be thrown 

你是正確的,它是無效的,但不正確的,一個例外是拋出。除非對象具有定義的有效__toString()方法,哪個PDOStatement沒有,嘗試將其轉換爲字符串將生成PHP錯誤,而不是異常。這是因爲嘗試將對象轉換爲字符串的代碼是PHP內核的一部分,而不是某個類中的某個位。

如果您想查看包含在PDOStatement對象中的查詢,您需要訪問只讀屬性$stmt->queryString

+0

'echo $ qry'是故意嘗試拋出一個異常,但我現在明白與你的好解釋不同。 – andrew