以下代码运行良好:
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
,如您所见 PDOException
当 spl_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/