【问题标题】:How to catch exception from a class loaded with autoload in PHP?如何从 PHP 中自动加载的类中捕获异常?
【发布时间】:2017-04-24 00:48:33
【问题描述】:

以下代码运行良好:

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/>";

在第一个代码中,我得到“无法连接到数据库!”错误(捕获异常),但第二次连接失败时出现致命错误? (未捕获的异常),我该如何解决?

(注意:第二个代码中的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;
    }

}

?>

【问题讨论】:

    标签: php exception pdo namespaces autoload


    【解决方案1】:

    我正在回答我自己的问题,因为我现在明白发生了什么:问题是当脚本抛出 PDOException 时,您可以看到在执行 spl_autoload_registerPDOException 类不存在,因此没有捕获到异常。为了解决这个问题,我将这一行放在 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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 2015-11-13
      • 1970-01-01
      • 2017-04-07
      • 2017-09-26
      • 2018-07-14
      相关资源
      最近更新 更多