duanjiaopi8218 2014-03-31 18:28
浏览 73
已采纳

php尝试捕获不捕获异常

When testing my try-catch block with database->Select I was expecting the exception to be caught when trying to echo a PDOstatement but instead it tells me the error is not caught.

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

I don't understand what I'm doing wrong here.

Here is the code:

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条回答 默认 最新

  • duan0427 2014-03-31 18:42
    关注

    A Catchable Fatal Error is not an Exception, it is an Error. It cannot be caught by a try/catch block, but by a custom error handler. See this answer for more info.

    This line:

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

    You are correct that it is invalid, but incorrect that an Exception is thrown. Unless an object has a valid __toString() method defined, which PDOStatement does not, attempting to cast as a string will generate a PHP error, not an Exception. This is because the code attempting to cast the object to a string is part of the PHP core, and not some bit in a class somewhere.

    If you want to look at the query contained in a PDOStatement object you need to access the read-only property $stmt->queryString.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 目详情-五一模拟赛详情页
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line