トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

2007/10/24、PHP5、PEAR_Exception の出力が見づらい

[カテゴリ:言語]
[カテゴリ:PHP]
[カテゴリ:PHP5]

2007/10/24、PHP5、PEAR_Exception の出力が見づらい

説明

require_once('PEAR/Exception.php');

try {
    try {
        throw new PEAR_Exception('ExceptionTest1');
    }
    catch (PEAR_Exception $e) {
        throw new PEAR_Exception('ExceptionTest2', $e);
    }
}
catch (PEAR_Exception $e) {
    echo $e;
}

このようにPEAR_Exceptionはそのままechoすれば、
整形されて出力されるのだけど、どうも個人的には見づらい。

  • 例外発生箇所lineの取得が間違ってる?(バグかな)
  • 例外をネストすると最新の例外のtraceしか出力されない。

独自に出力してみる。

スクリプト

<?php
echo 'phpversion : ' . phpversion() . "<br />\n";

require_once('PEAR/Exception.php');

class DumpException
{
    public static function display($e_)
    {
        echo self::toString($e_);
    }
    
    public static function toString($e_)
    {
        if (isset($_SERVER['REQUEST_URI'])) {
            return '<pre>' . self::_tostr($e_) . '</pre>' . PHP_EOL;
        }
        return self::_tostr($e_);
    }
    
    private static function _tostr($e_)
    {
        $msg = '';
        $exx = new PEAR_Exception('', $e_);
        $causes = $exx->getCause();
        if ($causes != null) {
            if (!is_array($causes)) {
                $causes = array($causes);
            }
            foreach ($causes  as $i => $cause) {
                /* @var $cause Exception */
                if ($cause instanceof PEAR_Exception) {
                    if ($cause->getCause() !== null) {
                        $msg .= self::_tostr($cause->getCause());
                    }
                } else {
                    if (! $cause instanceof Exception) {
                        $msg .= str_repeat(' ', $i) . (string)$cause . PHP_EOL;
                        continue;
                    }
                }
                $msg .= str_repeat(' ', $i) . get_class($cause) . ': ';
                $msg .= $cause->getMessage() . ' in ' . $cause->getFile();
                $msg .= ' on line ' . $cause->getLine() . PHP_EOL;
                $msg .= $cause->getTraceAsString() . PHP_EOL;
//              $msg .= print_r($cause->getTrace(), 1) . PHP_EOL;
            }
        }
        return $msg;
    }
}

class ExceptionTest
{
    function funcA($a, $b = null)
    {
        throw new PEAR_Exception('例外throw'); // 57行目
    }
}

try {
    $obj = new ExceptionTest();
    $obj->funcA('Test1');
}
catch (PEAR_Exception $e) {
    echo $e;
    DumpException::display($e);
}

try {
    try {
        $obj = new ExceptionTest();
        $obj->funcA('Test2');
    }
    catch (PEAR_Exception $e) {
        throw new PEAR_Exception('例外再throw', $e); // 76行目
    }
}
catch (PEAR_Exception $e) {
    echo $e;
    DumpException::display($e);
}

?>

スクリプト実行結果

テーブルタグで出力されているのがPEAR_Exceptionのデフォルト出力
テキストだけで色気がないのが、独自出力したもの。
例外をthrowしている行 57、76 が正しく表示され、
ネストされた例外のtraceも全て出力されている。
(PEAR_Exceptionだけでなく、Exceptionも対応してるつもり)

最終更新時間:2007年10月24日 19時19分10秒