1

例外をキャッチしようとするときは、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());
}
4

3 に答える 3

4

通常、アプリケーションコードでは使用しないでください。

使用する多くのスケッチコードはtry.. catch、いくつかのアイデアを示すための単なるスケッチです。そして、そのままコピーするべきではありません。

すべての例外をキャッチして適切なアクションを実行する(エラーメッセージをログに記録し、通常は503 HTTPエラーをスローする)アプリケーション全体の例外ハンドラーが必要です。

于 2012-12-24T10:19:07.743 に答える
1

tryに関すること-例外をスローする可能性のあるものをそこに配置する必要があります。
私が見たのは、execute / ...に接続されているすべてのステートメントをこのブロックに配置しているため、例外をスローする可能性があるものを誤解するのは簡単です...

于 2012-12-24T10:14:09.403 に答える
1

スローする可能性のあるステートメントによって発生した例外をキャッチするために、try / catch句を使用すると、世界が逆さまになります。代わりに、必要なのは、回復可能な例外が発生する可能性があることを事前に知っているステートメントのフォールバックメカニズムを明示的に提供することです。

例外をログファイルに書き留めて実行パスを続行することを選択できますが、セッションが未定義の状態のままになるため、問題が発生します(テスト中でない場合は、リリース後に発生します)。与えられた例では、ログファイルに何かを書き留めた後、世界が少し変わっていないように振る舞います。では、クエリ自体が、明らかにそれについて知らずに、現在欠落している財務記録を挿入しようとした場合はどうなるでしょうか。

于 2012-12-24T10:27:39.800 に答える