php尝试捕获不捕获异常

时间:2014-03-31 18:28:46

标签: php try-catch

使用database->Select测试我的try-catch块时,我希望在尝试回显PDO语句时捕获异常,但它告诉我错误没有被捕获。

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 个答案:

答案 0 :(得分: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