【问题标题】:not catching PDOException in namespace没有在命名空间中捕获 PDOException
【发布时间】:2012-11-16 20:37:56
【问题描述】:

我不知道如何在下面的代码中捕获PDOException,请告诉我在下面的代码中哪里抛出异常?

我有(目录):

 - folder
     -1) b.php
     -2) c.php

 - autoloader

b.php

<?php
namespace folder;
use folder as x;
require_once '../autoload.php';
class b{
    function __construct(){
        print("<p>you are in class b<p/>");
    }
}
$t=new x\c();
?>

c.php

class c{
    function __construct(){
        print("<p>you are in class c<p/>");

        if(DB_TYPE == 'mysql')  
        $pdoString=DB_TYPE.':dbname='.DB_NAME.';host='.DB_HOST;

        $pdoUsername=DB_USERNAME;
        $pdoPass='1';//DB_PASS; in this line I enter wrong password

    try{
            $this->pdo = new PDO($pdoString, $pdoUsername, $pdoPass);

    }catch(PDOException $e){ //we can't catch exception here!
        die('<p> Error DataBase Connection: '.$e->getMessage()."</p>");
    }
}
}
?>

我输入了错误的密码,我希望在我的try catch 块中捕获了异常但有这个输出:

 you are in class c

 Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES)' in C:\xampp\htdocs\TEST\folder\c.php:17 Stack trace: #0 C:\xampp\htdocs\TEST\folder\c.php(17): PDO->__construct('mysql:dbname=kn...', 'root', '1') #1 C:\xampp\htdocs\TEST\folder\b.php(10): folder\c->__construct() #2 {main} thrown in C:\xampp\htdocs\TEST\folder\c.php on line 17

【问题讨论】:

    标签: php database namespaces pdo


    【解决方案1】:

    你在一个命名空间中。因此,PHP 将寻找命名空间类 folder\PDOException 并尝试捕捉它(但失败)。

    要使用全局命名空间,只需在类名后面添加一个反斜杠即可:

    catch (\PDOException $e) {
    

    【讨论】:

    • @NavidMafakheri:全局命名空间是默认命名空间。当您没有使用namespace 语言结构指定任何内容时,PHP 使用的那个。阅读 PHP 手册中的命名空间。 php.net/manual/en/language.namespaces.php
    • 我不明白为什么我们必须使用反斜杠。命名空间中的正常行为是 PHP 回退到默认命名空间,以防找不到类。为什么在捕获异常时不会发生这种情况?
    • 4 年后,这个答案刚刚为我节省了几个小时的工作时间。那个反斜杠让我多次感到困惑。
    猜你喜欢
    • 2012-06-09
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    相关资源
    最近更新 更多