使用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();
}
}
}
答案 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
。