[PHP-users 2073] Re: error handling on PEAR DB

KOYAMA Tetsuji php-users@php.gr.jp
Fri, 14 Sep 2001 18:17:44 +0900


  小山です。

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

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

  PEAR::setErrorHandling() で登録する関数は generic なものにして、その
中で渡されてくるエラーオブジェクトによって、呼び出す関数を自分で切り替
えるというのはどうでしょう。

  class ErrorHandler {
    var $handlers = array();

    function handleError($err) {
      $ec = get_class($err);
      if (isset($this->handlers[$ec])) {
        $handler = $this->handlers[$ec];
        if (is_string($handler)) {
          call_user_func($handler, $err);
        }
        elseif (is_array($handler) &&
                is_object($handler[0]) &&
                is_string($handler[1])) {
          call_user_method($handler[0], $handler[1], $err);
        }
      }
      else {
        // default error handler
      }
    }

    function setHandler($type, $handler) {
      $lower = strtolower($type);
      $this->handlers[$lower] = $handler;
    }
  }

  $eh = new ErrorHandler;
  PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array($eh, 'handleError'));

  $eh->setHandler('DB_Error', 'db_error_handler');
  $eh->setHandler('Hoge_Error', 'hoge_error_handler');

みたいな感じ。(上のコードは実行してないのでバグバグかもしれません)

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

  私も今は DB::isError() を使っています。この辺は変わりそうな気がする
ので、依存しちゃうのはまだ早いかなぁと思っています。(^^;

-- 
	小山 哲志@ビート・クラフト
	koyama@beatcraft.com
	koyama@hoge.org