我有一个用于更新,选择,删除和插入语句的抽象类。在我的数据库连接函数中,config.php我有
function dbconnect()
{
$dbh; // database handler
$host = 'localhost';
$user = 'root';
$pass = '';
$dbname = '';
$error;
// Set DSN
$dsn = 'mysql:host=' . $host . ';dbname=' . $dbname;
// Set options
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false
);
// Create a new PDO instanace
try{
$dbh = new PDO($dsn, $user, $pass, $options);
}
// Catch any errors
catch(PDOException $e){
$error = $e->getMessage();
}
return $dbh;
}
通知尝试捕获错误
在我的抽象类中。
public function __construct() {
$this->dbh = dbconnect();
}
public function query($query) {
$this->stmt = $this->dbh->prepare($query);
}
public function bind($param, $value, $type = null) {
if(is_null($type)) {
switch (true) {
case is_int($value):
$type = PD0::PARAM_INT;
break;
case is_bool($value);
$type = PDO::PARAM_BOOL;
break;
case is_null($value);
$type = PDO::PARAM_NULL;
break;
default :
$type = PDO::PARAM_STR;
}
}
$this->stmt->bindValue($param, $value, $type);
}
}
我的问题
在构造中我连接到数据库,这也意味着我在这里捕获错误,在另一个函数中我没有错误处理,我没有返回任何错误。在我有其他功能的错误处理中,它们是否有任何意义?如果是,您建议我如何处理此问题?我仍然需要PDO和OOP,但我确实尝试以正确的方式做事。请建议
答案 0 :(得分:3)
基本上,如果你无法连接到数据库,那么拥有任何其他代码是没有意义的,对吧?然后只需不捕获异常。异常将冒出来甚至阻止您的类被实例化,这意味着您不必担心任何其他代码中的错误处理,因为它永远不会被执行。这就是在构造函数中抛出异常的重点。
例外情况是发出异常情况。如果您无法连接到数据库,那是非常特殊的情况。这会使整个数据库层无法正常运行。从数据库层抛出异常是正确的做法,因为数据库层不可操作,并且本身无法处理此问题。它需要向系统的其余部分发出信号,告知它无法工作,系统的其余部分需要决定在这种情况下要做什么。如果有的话,在应用程序中更高的位置捕获异常,并通过在那里显示错误页面来对其做出反应。
对于在常规查询期间可能发生的其他异常,适用相同的规则。确定问题是否可以恢复,以及在数据库类中捕获和处理它是否有意义,或者异常(同样,这是永远不会发生的事情)意味着它是时候放弃了。
答案 1 :(得分:0)
您可能需要在数据库包装器的构造函数中处理Exception的唯一时间是确保抛出特定的类型的Exception并将其冒泡到应用程序 - 尽管我只能看到这个在构建可以切换数据库连接对象的包装器时很有用。
如果您正在使用Factory模式,例如可以创建mysqli
或PDO
对象,您可能希望构造函数捕获mysqli::connect_error
(不是Excepton)AND { {1}}并且始终抛出一个公共PDOException
(扩展AppException
)。
所以在mysqli构造函数中你可能只需要:
Exception
虽然在PDO包装器构造函数中你可能有:
$dbConn = new mysqli($sHost, $sUsername, $sPassword, $sSchema, $iPort);
if($dbConn->connect_error) {
throw new AppExecption(AppException::DB_CONNECT, $dbConn->connect_error);
}
所以你并没有真正处理构造函数中的PDOException - 只是将它转换为一种常见的Exception类型,当它被冒泡到应用程序时可以以特定的方式处理,无论你是否构建了一个mysqli对象或PDO。