- ベストアンサー
PDOでのtry~catch構文の使い方とは?
- PHP5のPDOは、try~catch構文に対応しています。どのように使えば良いのでしょうか?SQLを発行するメソッドの度にtry~catchが必要なのか、例外処理を行わずに放置しても問題はないのか疑問です。
- 現時点では、例外が発生した場合には、単にtrigger_errorでエラーメッセージを表示しています。しかし、そのまま放置しても問題ないのか不安です。
- 正しい使い方や最適な例外処理の方法を教えていただきたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
try{ }catch{ }は、トランザクションに対応しているデータベースへ接続するときに、真価を発揮します。たとえば、SQLite3 や MySQL5.0などです。 insert文や、update文などデータを変更するSQL文を発行する前に、 PDO::beginTransaction() とし、以降の処理をtry構文内で行います。 途中でエラーがあった場合に、catch構文内へ処理が飛び、そこで PDO::rollBack() を呼ぶと途中までの処理をキャンセルすることができます。 エラーが無ければ、try構文の最後に PDO::commit() を発行して、全ての処理を有効にします。 http://jp.php.net/manual/ja/pdo.transactions.php manual に例文もありますのでよく読んで使ってみて下さい。 select文では、データに変更が無いので、PDO::rollBack() しても意味がありません。 また、MySQL4.0では、トランザクションに対応していないので、PDO::rollBack() を呼ぶと致命的エラーとなってしまいます。 これらでは、try{ }catch{ } よりは、例外キャッチ関数を使う方が、エラー時の処理が一カ所に集約されるのでよいでしょう。 いずれの操作も行わずエラー放置というのは、プログラムの異常終了を招いたうえに、何でエラーが出てるのか解らなくなったりしますので、よくないと思います。 例外キャッチ関数を使うには、PDOのエラーは、例外を投げるモードにしておいて(他の通常のエラーと区別しやすくする) PDO::setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) さらに、例外をキャッチする関数を定義しておくと、どこで例外が発生しても、エラー表示用の記述は一カ所で済みます。 ーーー記述例 <?php function exception_handler($e){ print '<div style="border:red 3px double;"><em>エラー</em> '.$e->getMessage() . '</div>'; } set_exception_handler('exception_handler') ; $dbh = new PDO('sqlite:sql_db', '', ''); if( ! is_object( $dbh) ){ echo "接続エラー"; exit; } echo "接続しました\n"; $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 以降、いろいろ操作、PDOのエラーが出たときは、exception_handler() が実行される。 // rollBackの必要性がなければ try文は不要。 // try文を書いたなら、exception_handler()は呼ばれなくなるので、catchしなければならない。 ?>
お礼
ご回答ありがとうございます。 MySQL5ですので、トランザクションを使っております。その際には、もちろん、catch して、rollBackしております。 それ以外の場合は、trigger_error するだけなので、try~catchは行数もかさんで邪魔だなと思っていたのですが、exception_handler で捕捉してやればいいのですね。ありがとうございました。 他の方の意見も聞いたのですが、捕捉されない例外はuncaught exception エラーを起こすので、捕捉後trigger_error するくらいなら、そのまま放置してもよいとの答えでした。 ありがとうございました。