[PHP-users 2033] error handling on PEAR DB

TAKAHASHI Masayoshi php-users@php.gr.jp
Thu, 13 Sep 2001 18:33:23 +0900


高橋征義です。

PEARのDBクラスを触ってみているのですが、エラーの扱いについて
質問があります。

エラーについては、DB::isError()を毎回使って調べるような形の
処理もできるようです(深谷崇さんの「PEAR DBクラスの使い方」
(http://www.dokokano.com/php/php_pear_db.html)はこのスタイル
ですね。この文書、大変参考になりました(_o_))。が、せっかく
例外を使っているんだから、エラー処理はどこかにまとめたい。
そこで調べてみたところ、setErrorHandling()を使えばよさそうだ
というところまでは判りました。

ところが、例えば、

  function db_error_handler($error) {         // handler定義
    ..(略)..
  }
  PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'db_error_handler');

としてしまうと、DB以外のPEARなクラスで例外が発生した場合でも
db_error_handlerが呼ばれてしまうような気がします。
これはうれしくありません。

これを回避するには、

  function db_error_handler($error) {         // handler定義
    ..(略)..
  }
  $con = DB::connect($dsn);                   // DB接続
  $con->setErrorHandling(PEAR_ERROR_CALLBACK, 'db_error_handler');

という方法があるようですが、これでは DB::connect に失敗した時
にはdb_error_handlerが呼ばれません(まあ、これは当然か)。とはいえ、

  function db_error_handler($error) {         // handler定義
    ..(略)..
  }
  if (DB::isError($con = DB::connect($dsn)) { // DB接続
    ..(エラー処理)..
  }
  $con->setErrorHandling(PEAR_ERROR_CALLBACK, 'db_error_handler');

としてしまうと、せっかくなくしたはずのisErrorがまた現れて、
ちょっといやな感じです。

こういう場合にはどうするのがよいのでしょうか。

 a) 最後の方法を使う。DB::connectではDB::isErrorで調べるのは
    仕方ないと思ってあきらめる/気をつける(^^;

 b) PEAR::setErrorHandling を使って、DB::connectのエラーは
    そこで拾うことにする。

 c) db_connect($dsn, $db_error_handler) みたいな新しい関数を作って、
    そこで接続とハンドラの登録を行う。接続に失敗したらハンドラを
    実行する。

……やっぱりc)の方法がいいんでしょうかね。でも、なにかこう
とってつけた感じがするのですが。DBクラスを使っている、という
のもソースから判りにくくなりそうですし。

PEARのDBクラスを使っている人は、どうしているのでしょうか?
# やっぱり毎回isError()を使うスタイルの方がふつう?

高橋征義 (TAKAHASHI Masayoshi)       Email:maki@inac.co.jp