在尝试捕获异常时,应将prepare和bindParam语句放在try {}块中。可以准备和bindParam导致/生成/无论正确的术语是例外吗?
现在我只在try {}中放入execute(),我不知道这是否是正确的做事方式。
所以,我应该这样做:
$s = $dbh->prepare("select * from products where id=:p_id");
$s->bindParam(":p_id",$p_id,PDO::PARAM_INT);
try {
$s->execute();
} catch (PDOException $e) {
log_error("MySQL error: ".$e->getMessage());
}
或
try {
$s = $dbh->prepare("select * from products where id=:p_id");
$s->bindParam(":p_id",$p_id,PDO::PARAM_INT);
$s->execute();
} catch (PDOException $e) {
log_error("MySQL error: ".$e->getMessage());
}
答案 0 :(得分:4)
通常,它根本不应该在应用程序代码中使用。
许多使用try.. catch
的草图代码只是草图,以显示一些想法。不应该按原样复制。
应该有一个应用程序范围的异常处理程序,负责捕获所有异常并采取适当的操作(记录错误消息并正常抛出503 HTTP错误)。
答案 1 :(得分:1)
关于尝试的事情 - 你应该把东西放在那里可以抛出异常 我所看到的 - 将所有语句连接到执行/ ...进入这个块,这是因为被误导可以抛出异常......
答案 2 :(得分:1)
我认为有一个try / catch子句是为了捕获任何可能抛出的语句引发的异常,这是世界颠倒的。相反,您想要的是明确地为您事先知道可能发生异常的语句提供回退机制。
您可以选择在日志文件中记下异常并继续执行路径,但这会导致问题(如果没有测试,则会在发布后),因为这会使会话处于未定义状态。在给出的示例中,您可以在日志文件中写下一些内容,之后您的行为就像世界没有改变一样。现在如果查询本身试图插入您现在缺少的财务记录而不明白它,该怎么办?