php – PDO异常未被捕获

我是新手使用PDO,我发现由于查询语句中的错误导致的异常没有被捕获并正确显示.发生这种情况时的页面输出通常如下所示:

Fatal error: Uncaught exception 'PDOException' with message 'sqlSTATE[42000]: ...

我使用以下函数进行PDO查询

/**************************************************************************************************************
* Function: makeQuery                                                                                         *
* Desc: Makes a PDO query.                                                                                    *
* Pre conditions: The statement/query and an array of named parameters (may be empty) must be passed.         *
* Post conditions: The PDO query is executed. Exceptions are caught, displayed, and page execution stopped.   *
**************************************************************************************************************/
function makeQuery($stmt, $array, $errMsg = '')
{
    try 
    {
        $stmt->execute($array);
    }
    catch (PDOException $e) 
    {
        print $errMsg != ''?$errMsg:"Error!: " . $e->getMessage() . "<br/>";
        die();
    }
}

知道为什么没有被捕获的例外吗?

编辑:这是我创建PDO对象的方式:

function createPDO()
{
    // MysqL connection details
    $dbhost = '';
    $dbuser = '';
    $dbpass = '';
    $dbname = '';

    try
    {
        $db = new PDO("MysqL:$dbhost=localhost;dbname=$dbname;charset=utf8", $dbuser, $dbpass, array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    }
    catch (PDOException $e)
    {
        print "Error!: " . $e->getMessage() . "<br/>";
        die();
    }

    return $db;
}

解决方法:

您确定每个查询都在运行该函数吗?可以通过您的代码查看100%确定.

一个选择是定义一个全局异常处理程序,然后只询问抛出的异常行和&文件来自:

http://php.net/manual/en/function.set-exception-handler.php

function exception_handler($exception)
{
  echo "Uncaught exception: " . $exception->getMessage() . PHP_EOL;
  echo "In file: " . $exception->getFile() . PHP_EOL;
  echo "On line: " . $exception->getLine() . PHP_EOL;
}

set_exception_handler('exception_handler');

编辑:
经过OP的一些对话后,我现在确定PDOStatement :: prepare的调用是抛出异常的地方,因此我建议另一个包装函数到库中:

function prepareStmt(PDO $oPdo, $sstmt, array $aDriverOptions=array())
{
  try
  {
    return $oPdo->prepare($sstmt, $aDriverOptions);
  }
  catch(PDOException $e)
  {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
  }
}

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...