アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHP5のPDOはtry~catch構文に対応しているのですが、どのように使えばいいのでしょうか?

SQLを発行する度に、もしくはSQLを発行するメソッドの度に、try~catchしなければいけないのでしょうか?とても面倒です。

現時点では、例外が発生した時にする処理といえば、
trigger_error($e->getMessage(), E_USER_ERROR);
みたいに、trigger_error するだけです。

であれば、そもそもcatchせずに、uncaught のまま勝手にエラったままに放っておいても問題ないのでしょうか?

よろしくお願いいたします。

A 回答 (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しなければならない。
?>

参考URL:http://jp.php.net/manual/ja/book.pdo.php
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

MySQL5ですので、トランザクションを使っております。その際には、もちろん、catch して、rollBackしております。

それ以外の場合は、trigger_error するだけなので、try~catchは行数もかさんで邪魔だなと思っていたのですが、exception_handler で捕捉してやればいいのですね。ありがとうございました。

他の方の意見も聞いたのですが、捕捉されない例外はuncaught exception エラーを起こすので、捕捉後trigger_error するくらいなら、そのまま放置してもよいとの答えでした。

ありがとうございました。

お礼日時:2008/04/22 16:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!