思考:PDOException可以捕捉到异常,也有其他模式,那么在实际开发的时候我们到底是使用PDO的那种错误模式呢?
引入:其实PDO之所以提供了这么多模式,就是要使用人员根据实际情况来选择模式,如果一个项目中,需要我们去控制项目bug,那么就适合使用异常模式来进行处理
PDOException异常处理【掌握】
定义:PDOException 是PDO从Excetion继承的一个用于处理PDO错误的异常类,一般如果做一套扩展,都会从Exception类继承实现一套明确的错误机制(错误来自哪里)
1.要使用PDOException异常处理,需要设定PDO的错误模式为异常模式,在PDO中可以通过两种模式来实现异常模式设定
- 在初始化PDO对象的时候,利用第四个参数来设定
- 在初始化PDO之后,利用PDO::setAttrinute()方法来修改错误模式
<?php //初始化PDO时设定错误模式 $drivers=array( PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCPTION ); $link=new PDO('mysql:host=localhost;port=3306;dbname=senven;charset=utf8','root','root',$drivers); //初始化之后设置异常模式 $pdo=new PDO('mysql:host=localhost;port=3306;dbname=senven;charset=utf8','root','root'); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCPTION); } ?>
2.当确定了我们要使用异常模式处理之后,我们就可以针对可能出错的未知使用异常来进行捕捉了(通常是进行SQL执行的时候)
<?php //初始化PDO时设定错误模式 $drivers=array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ); $link=new PDO('mysql:host=localhost;port=3306;dbname=senven;charset=utf8','root','root',$drivers); try { $link->exec('set names utf-8'); //错误 } catch (PDOException $e) { echo 'SQL错误'; echo $e->getline(); die(); } ?>
3.PDO执行来讲,因为PDO异常模式的设置是在PDO实例化之后,那么如果PDO实例化的时候错误,此时好像PDOException就无法工作了,事实上,PDO也考虑到了这点,
所以实例化的时候,本身是可以使用try{}catch(){}来捕获的
<?php //初始化PDO时设定错误模式 $drivers=array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ); try { //这里dbname原本是senven 我们少打一个n,可以捕获到的 $link=new PDO('mysql:host=localhost;port=3306;dbname=senve;charset=utf8','root','root',$drivers); } catch (PDOException $e) { echo 'SQL错误'; echo $e->getline(); die(); } ?>
4.PDO执行过程中,如果碰到了意外,(逻辑无法继续执行),那么可以主动抛出异常
try { //这里dbname原本是senven 我们少打一个n,可以捕获到的 $link=new PDO('mysql:host=localhost;port=3306;dbname=senve;charset=utf8','root','root',$drivers); } catch (PDOException $e) { my_exception($e); } //因为异常使用比较多,我们可以对异常 处理进行封装 function my_exception(PDOException $e){ echo 'SQL执行错误'.'<br>'; echo '错误行号'.$e->getLine().'<br>'; echo '错误信息'.$e->getMessage().'<br>'; }
//如果我想执行一个sql语句,语法是没有错误的,但是id为100的是不存在的 mysql也不会报错 //这样的话就不能给用户提示删除成功 //这种情况就需要我们抓异常主动抛出异常 try { $link=new PDO('mysql:host=localhost;port=3306;dbname=senven;charset=utf8','root','root',$drivers); $res=$link->exec('delete from hylist where id=100'); if(!$res) throw new PDOException('删除失败'); //抛出删除失败 } catch (PDOException $e) { my_exception($e); }
总结:
1.PDOException 是一种用来捕获异常PDO(PDOStatement)类使用或称中产生的错误的
2.PDOException 在使用之前需要开始异常模式(PDO实例化除外,可以直接捕获)
3.PDOEExcepion一般是在SQL执行过程中出错,如果其他代码执行过程中,业务逻辑不符合要求(代码没问题),那么也可以使用throw new PDOException ()主动抛出异常
来源:https://www.cnblogs.com/xiaowie/p/12591617.html