如何从 PHP 中使用自动加载加载的 class 捕获异常?
How to catch exception from a class loaded with autoload in PHP?
以下代码运行良好:
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/>";
在第一个代码中,我得到了 "Cannot connect to the database!" 错误(捕获到异常),但是在第二个代码中,我得到了连接失败导致的致命错误? (异常未捕获),我该如何解决?
(注:第二个代码中的Dclass原样位于目录\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
class执行 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;
}
}
}
以下代码运行良好:
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/>";
在第一个代码中,我得到了 "Cannot connect to the database!" 错误(捕获到异常),但是在第二个代码中,我得到了连接失败导致的致命错误? (异常未捕获),我该如何解决?
(注:第二个代码中的Dclass原样位于目录\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
class执行 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;
}
}
}