[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