Home  >  Q&A  >  body text

mysql - php pdo 缺省错误模式 和 例外模式,差不多,为什么弄两个?

先说 缺省模式

$pdo->setAttribute(PDO::ATTR_ERRMODE,  PDO::ERRMODE_SILENT);

我做的实验中,出错后,会给 $pdo->errorCode() 和 $pdo->errorInfo() 赋值;通过调用他们可以可以 看 错误的详细信息;


然后说例外模式

$pdo->setAttribute(PDO::ATTR_ERRMODE,  PDO::ERRMODE_EXCEPTION);
try{

}catch(PDOException $e){
    echo "执行命令失败:".$e->getMessage();
    exit;
}

会实例出一个 $e 对象,错误信息保存在这个属性里.

都是有错误信息,为什么要分两个属性?

天蓬老师天蓬老师2769 days ago776

reply all(2)I'll reply

  • PHP中文网

    PHP中文网2017-04-10 17:52:03

    /*错误模式说明:

    
    
    ◆异常模式:
        $pdo->setAttribute(PDO::ATTR_ERRMODE,  PDO::ERRMODE_EXCEPTION);
    
        这个模式需要配合 try 使用 :
            一旦出错,就会:
            1.创建一个对象,$e 也可以随便命名,从 $e->getMessage() 获取错误信息;
            2.采取动作;
    
            try{
                
                要执行的命令...
    
            }catch(PDOException $e){
                echo "执行命令失败:".$e->getMessage();
                失败后的动作...
            }
    
        这个其实等于 ◆缺省模式的 if($pdo->errorInfo()[2]) ...
    
        创建PDO的时候,为什么也用 try?
            因为这时候连PDO对象都没有,所以也不能设置错误模式,所以可以用try,
            一旦PDO创建成功,错误模式就成了 ◆缺省模式,
            也就不能用try了.
    
    ◆缺省模式:
        $pdo->setAttribute(PDO::ATTR_ERRMODE,  PDO::ERRMODE_SILENT);
    
        这个出错,会给 $pdo->errorCode() 和 $pdo->errorInfo()[2] 赋值;
    
            可以用 
                if($pdo->errorInfo()[2]) 
                if($pdo->errorCode()) 
            判断脚本是不是出错.
    
        如果不出错,上面都是空的;
    
    ◆警告模式:
        $pdo->setAttribute(PDO::ATTR_ERRMODE,  PDO::ERRMODE_WARNING);
    
        这个会echo出一个错误信息,打乱了脚本;
        学习调试的时候使用比较好;
        真用起来的时候,很多时候判断不出到底脚本有没有出错;
    

    */

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 17:52:03

    你太纠结了...这是为了方便使用者,为啥一定要有个为什么。就像是有些API通过参数可以选择返回json还是xml,有什么特别的意义吗?也是为了方便而已。

    reply
    0
  • Cancelreply