学科分类
目录
PHP基础

PDOException异常处理

PDOException类继承自RuntimeException运行异常类(继承自Exception类)。接下来学习使用PDOException类进行异常处理。

使用PDOException类进行异常处理,需要先将错误处理模式设置为EXCEPTION模式,在上一节的学习中通过使用PDO:: setAttribute()方法进行设置,本节将通过使用PDO::__construct()的第4个参数$driver_options来设置。

创建C:\web\apache2.4\htdocs\pdo05.php文件,具体代码如下所示。

 1  <?php
 2  $dsn = 'mysql:host=localhost;port=3306;dbname=mydb;charset=utf8';
 3  $drivers = array(
 4    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
 5  );
 6  $pdo = new PDO($dsn, 'root', '123456', $drivers);

上述代码中,使用PDO::__construct()的第4个参数来设置错误模式和实例化PDO对象,当实例化对象时,如果出现异常,同样可以使用PDOException类来捕获异常,修改上述实例化PDO对象的代码,具体如下所示。

 1  <?php
 2  $dsn = 'mysql:host=localhost;port=3306;dbname=mydb;charset=utf8';
 3  $drivers = array(
 4    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
 5  );
 6  try{
 7    $pdo = new PDO($dsn, 'root', '123456', $drivers);
 8  }catch(PDOException $e){
 9    echo '数据库连接失败!<br/>';
 10    echo '错误文件为:' . $e->getFile() . '<br/>';
 11   echo '错误行号为:' . $e->getLine() . '<br/>';
 12   echo '错误描述为:' . iconv('gbk', 'utf-8', $e->getMessage());
 13 }

上述代码中,将实例化PDO对象的代码使用try…catch语句包裹,此时将端口号修改为3307,运行上述代码,输出结果如图1所示。

img

图1 PDOException连接失败

需要注意的是,在上述第12行代码中,对错误信息使用iconv()函数将字符集转换成UTF-8,这是由于PDO底层使用的字符集为GBK,不做处理直接输出会造成乱码问题。

实例化PDO对象后,使用try…catch语句来处理异常,具体代码如下所示。

 1  $stmt = $pdo->prepare('SELECT * FROM `test`');
 2 try{
 3   $stmt->execute();
 4 }catch(PDOException $e){
 5   echo 'SQL执行错误!<br/>';
 6   echo '错误文件为:' . $e->getFile() . '<br/>';
 7   echo '错误行号为:' . $e->getLine() . '<br/>';
 8   echo '错误描述为:' . $e->getMessage();
 9 }

上述代码执行后,运行结果如图2所示。

img

图2 PDOException类输出内容

点击此处
隐藏目录