[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 メーリングリストの案内