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

标签 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 );
            $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/>";

但如果我也这样做:
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/>";

在第一个代码中,我得到“无法连接到数据库!”错误(捕获异常),但在第二个我因连接失败而收到 fatal error ? (异常未捕获),我该如何解决?

(注意:第二个代码中的 D 类位于目录\core\system\中:
<?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 ,如您所见 PDOExceptionspl_autoload_register 时,类不存在执行,因此未捕获异常。为了解决这个问题,我把这一行放在 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;
        }
    }
}

关于php - 如何从在 PHP 中使用自动加载加载的类中捕获异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41045197/

相关文章:

c# - 我应该为失败的文件解析抛出什么异常?

java - C++、Java 和 JavaScript 异常处理之间有什么区别?

php - 将可变数量的参数传递到 PDO 语句并返回 JSON 对象

php - 函数文件将无法识别包含的 PDO 数据库连接

php - 为什么这个 mysql 查询实际上没有更新任何东西

java - 在预期的情况下处理 NumberFormatException 的正确方法是什么?

php - 如何使用 CURL 而不是 file_get_contents?

php - cUrl 打开多个 URL

java - 使用 Java 生成 .ov2 文件

php - 对SEO URL的POST请求被禁止