我已经在stackoverflow上阅读了几个关于这些问题的线程:
而且,说实话,我不确定我理解答案 - 有人说是,有人拒绝。所以,我想举例说明我的做法......如果你能给我这两个问题的答案。
database.php中:
try {
$connection= new PDO(DB_DNS, DB_USER, DB_PASS);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(Exception $e) {
echo "Error: ".$e->getMessage();
die();
}
user.php的:
class User {
public function pronadjiSveUsere() {
global $connection;
$sql= $connection->prepare("SELECT * FROM users");
$result = $sql->execute();
return $result ;
}
public function find_by_id($id=0) {
global $connection;
$sql= $connection->prepare("SELECT * FROM users WHERE id = :id");
$result = $sql->execute(array($id));
return $result->fetch(PDO::FETCH_OBJ);
}
}
如您所见 - 类用户有两种方法。我的问题是:
1。在这些情况下我应该使用try-catch吗? 2.如果答案是肯定的 - 我应该在方法中,例如:
public function find_by_id($id=0) {
try {
global $connection;
$sql= $connection->prepare("SELECT * FROM users WHERE id = :id");
$result = $sql->execute(array($id));
return $result->fetch(PDO::FETCH_OBJ);
} catch(Exception $e) {
echo $e->getMessage();
die();
}
}
或周围,只要我使用这些方法,例如:
try {
user->find_by_id($id);
} catch(Exception $e) {
echo $e->getMessage();
die();
}
提前谢谢!
答案 0 :(得分:2)
您可以撰写有关该主题的书籍。事实上,我相信是有关此主题的书籍。所以我会保持简短
对于您的所有代码段,我会说不 - 最后一个的可能的例外。
第一个:database.php不应该决定是否继续。所以捕获/死亡块甚至可能被认为是邪恶的。 ESP。无条件打印“真实”错误消息时。某些上层可能想要尝试另一个连接。或打印一位鸽友“对不起,出了点问题。我们正在尽力将yaddayadda带回来”的消息。或者在没有数据库的情况下尽其所能。 (也许这是可能的。如果database.php让php实例死掉的话,那就不是了。)
您的类用户的相同参数。除非有某些东西(智能的),否则用户中的代码可以处理异常,它应该远离处理它。 [打印错误消息+ die 处理异常]
同样,方法本身可以合理地缓解问题是不太可能(尽管不是不可能) - 因此,远离异常;其他一些,上层无论如何都必须处理它。
所以,只有当 能够真正处理它时才处理execpetion 编辑:但有时将一个实际的异常“转换”为上层感兴趣的东西是个好主意。然后你会得到一个不能真正处理异常但是构建一个新异常的catch块(如果可能的话,包括最初的例外)并抛出它。
答案 1 :(得分:1)
如果您需要在每次查询失败时停止应用程序并抛出异常 - 尝试使用php函数set_exception_handler并删除代码中PDO的所有try ... catch块。此函数为所有未捕获的异常注册全局处理程序。但 例如
<?php
set_exception_handler(function ($e) {
// Processing only PDOExceptions
if ($e instanceof PDOException) {
echo $e->getMessage();
die();
} else {
throw $e;//do not process other exceptions
}
});
?>
在任何Sql查询之前需要调用此函数。