[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