如何在PHP中从自动加载的类捕获异常?

如何在PHP中从自动加载的类捕获异常?,php,exception,pdo,namespaces,autoload,Php,Exception,Pdo,Namespaces,Autoload,以下代码运行良好: class D { public static function databaseConnected( $db_server, $db_name, $db_user, $db_password ) { try { $newDatabaseConnection = new PDO( "mysql:host=$db_server;dbname=$db_name", $db_user, $db_password );

以下代码运行良好:

class D {



    public static function databaseConnected( $db_server, $db_name, $db_user, $db_password )
    {
        try {
            $newDatabaseConnection = new PDO( "mysql:host=$db_server;dbname=$db_name", $db_user, $db_password );
            $newDatabaseConnection->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
            return $newDatabaseConnection;
        }
        catch (PDOException $e) {
            //echo $e->getMessage() . "<br/>";
        }
        return null;
    }

}

echo "#HEADER#<br/>";
if ($globalConn = D::databaseConnected())
    require("content.php");
else
    echo "Cannot connect to the database!<br/>";
echo "#FOOTER#<br/>";
D类{
公共静态函数数据库已连接($db\u服务器,$db\u名称,$db\u用户,$db\u密码)
{
试一试{
$newDatabaseConnection=newpdo(“mysql:host=$db_server;dbname=$db_name”,$db_user,$db_password);
$newDatabaseConnection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常);
返回$newDatabaseConnection;
}
捕获(PDO$e){
//echo$e->getMessage()。“
”; } 返回null; } } 回音“#标题#
”; 如果($globalConn=D::databaseConnected()) 要求(“content.php”); 其他的 echo“无法连接到数据库!
”; 回声“#页脚#
”;
但如果我也这样做:

spl_autoload_register ( function ($class_name) {

    $class_name = str_replace ( "\\", "/", $class_name );
    require ("{$class_name}.php");
} );

use core\system\D;

error_reporting(E_ERROR);

echo "#HEADER#<br/>";
if ($globalConn = D::databaseConnected())
    require("content.php");
else
    echo "Cannot connect to the database!<br/>";
echo "#FOOTER#<br/>";
spl\u自动加载寄存器(函数($class\u名称){
$class\u name=str\u replace(“\\”、“/”、$class\u name);
需要(“{$class_name}.php”);
} );
使用core\system\D;
错误报告(E_错误);
回音“#标题#
”; 如果($globalConn=D::databaseConnected()) 要求(“content.php”); 其他的 echo“无法连接到数据库!
”; 回声“#页脚#
”;
在第一段代码中,我得到了“无法连接到数据库!”错误(捕捉到异常),但在第二段代码中,由于连接失败,我得到了一个致命错误?(异常未捕获),我如何解决此问题

(注意:第二个代码中的D类位于\core\system\as目录中:

<?php

namespace core\system;

use PDO;

class D {



    public static function databaseConnected( $db_server, $db_name, $db_user, $db_password )
    {
        try {
            $newDatabaseConnection = new PDO( "mysql:host=$db_server;dbname=$db_name", $db_user, $db_password );
            $newDatabaseConnection->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
            return $newDatabaseConnection;
        }
        catch (PDOException $e) {
            //echo $e->getMessage() . "<br/>";
        }
        return null;
    }

}

?>

我在回答我自己的问题,因为我现在知道发生了什么:问题是当脚本抛出
PDOException
时,正如您可以看到
PDOException
类在执行
spl\u autoload\u寄存器时不存在,因此无法捕获异常。为了解决这个问题,我将文件中的ne:

use PDOException;
解决方案如下:

<?php

namespace core\system;

use PDO;
use PDOException;

class D 
{
    public static function databaseConnected($db_server, $db_name, $db_user, $db_password)
    {
        try {
            $newDatabaseConnection = new PDO("mysql:host=$db_server;dbname=$db_name", $db_user, $db_password);
            $newDatabaseConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            return $newDatabaseConnection;
        }
        catch (PDOException $e) {
            //echo $e->getMessage()."<br/>";
            return null;
        }
    }
}

我在回答我自己的问题,因为我现在明白发生了什么:问题是当脚本抛出
PDOException
时,你可以看到
PDOException
类在执行
spl\u autoload\u寄存器时不存在,因此无法捕获异常。为了解决这个问题,我将e在D的文件中:

use PDOException;
解决方案如下:

<?php

namespace core\system;

use PDO;
use PDOException;

class D 
{
    public static function databaseConnected($db_server, $db_name, $db_user, $db_password)
    {
        try {
            $newDatabaseConnection = new PDO("mysql:host=$db_server;dbname=$db_name", $db_user, $db_password);
            $newDatabaseConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            return $newDatabaseConnection;
        }
        catch (PDOException $e) {
            //echo $e->getMessage()."<br/>";
            return null;
        }
    }
}