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所示。
图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所示。
图2 PDOException类输出内容