1

尝试捕获异常时,应将 prepare 和 bindParam 语句放在 try{} 块中。可以准备和 bindParam 导致/生成/whatever-the-proper-term-is 异常吗?

现在我只在 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());
}
4

3 回答 3

4

通常它根本不应该在应用程序代码中使用。

许多使用try.. catch的草图代码只是草图,以显示一些想法。并且不应该照原样复制。

应该有一个应用程序范围的异常处理程序,负责捕获所有异常并采取适当的措施(记录错误消息并正常抛出 503 HTTP 错误)。

于 2012-12-24T10:19:07.743 回答
1

关于尝试的事情 - 你应该把可以抛出异常的东西放在那里。
我所看到的 - 将所有连接到 execute/... 的语句放入这个块中,很容易被误导什么会抛出异常......

于 2012-12-24T10:14:09.403 回答
1

我认为有一个 try/catch 子句是为了捕获任何可能抛出的语句引发的异常,这是颠倒的世界。相反,您想要的是显式地为您事先知道可能发生异常的语句提供回退机制,您可以从中恢复。

您可以选择在日志文件中写下异常并继续执行路径,但这会带来麻烦(如果不在测试中,它将在发布之后),因为这会使会话处于未定义状态。在给出的示例中,您就是这样做的,您在日志文件中写下一些内容,之后您的行为就像世界没有发生任何变化一样。现在,如果查询本身试图插入您现在丢失的财务记录,而您显然不知道该怎么办?

于 2012-12-24T10:27:39.800 回答