PDO基础应用之异常处理

思考: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