[PHP-users 25583] PHP5 Exception と PEAR_Error (Re: PEARについて)
KOYAMA Tetsuji
koyama @ hoge.org
2005年 5月 11日 (水) 15:47:20 JST
小山です。
最近になってようやく PHP5 で実用コードを書き始めています。
PHP5 で PEAR を利用する際にはエラー処理をどのようにするのかが悩まし
いところだと思います。PHP5 の例外を全面に使いたいところですが、PEAR パッ
ケージのクラスでは当然例外を投げてはくれずに PEAR_Error オブジェクトを
返します。この辺をなるべく簡単な記述で処理したいと思い、私は以下のクラ
スを作りました。
======================================================================
<?php
require_once 'PEAR.php';
require_once 'PEAR/Exception.php';
class Hoge_ExceptionWrapper {
static public function init() {
static $initialized = false;
if (!$initialized) {
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK,
array('Hoge_ExceptionWrapper',
'handleError'));
$initialized = true;
}
}
static public function handleError($err) {
throw self::factory($err);
}
static public function wrap($obj) {
if (is_a($obj, 'PEAR')) {
$obj->setErrorHandling(PEAR_ERROR_CALLBACK,
array('Hoge_ExceptionWrapper',
'handleError'));
}
}
static public function factory($err) {
// default exception class
$class = 'PEAR_Exception';
return new $class($err->getMessage(), $err->getCode());
}
}
?>
======================================================================
使用方法は以下の通りです。
最初に
Hoge_ExceptionWrapper::init();
を呼んでおくと、デフォルトの $mode で PEAR_Error を返しているクラスは、
PEAR のエラーコールバックの中で例外が throw されるようになります。
$mode を PEAR_ERROR_RETURN に直接指定しているパッケージもあるので、
その場合は従来の PEAR::isError() を用いてエラーチェックを行い、
if (PEAR::isError($obj)) {
Hoge_ExceptionWrapper::handleError($obj);
}
のように例外に変換します。
throw される例外オブジェクトは factory メソッド内で自由に指定できま
す。この例では常に PEAR_Exception を返すようになっています。
質問者の想定している回答とは全然違うと思いますが(笑)、この辺の情報が
まとまってるのを見たことがなかったので、ちょっと書いてみました。
--
小山 哲志@ビート・クラフト
koyama @ beatcraft.com
koyama @ hoge.org
PHP-users メーリングリストの案内