kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

TOOL更新_今日はExceptionクラス関連つくった。

1.今日はExceptionクラス関連つくった。まだ実験中なのでコーディング規約には沿っていないけど、徐々に、このページを直接直していくことにする。
■使い方はこんな感じ

・controllersでの使用例(ControllerBaseメソッドから抜粋)
    // 共通アクション(実装ロジック)
    public function _commAct() 
    {
        try {
            $this->_commActSub();
        // プログラム内のアプリケーション用例外
        } catch (AppException $e) {
            // エラー画面出力
            $this->_outErrHtml($e, Zend_Log::WARN);
            // DB rollback(継承先でDB使わないときは何もしない)
            $this->_dbRollback();
            exit;
        // プログラム内のシステム用例外
        } catch (SysException $e) {
            if ($this->_logger != null) {
                $this->_logger->outErrLog('The Sys Error occurred. ' . $e->getFile().":". 
                                                $e->getLine().":". $e->getMessage(), Zend_Log::ERR);
                echo 'Sys : Message: ' . 'The Sys Error occurred. ' . "<br />\n";
            } else {
                echo 'Sys : Message: ' . 'The Sys Error occurred. And logger = null.' . "<br />\n";
            }
            // DB rollback(継承先でDB使わないときは何もしない)
            $this->_dbRollback();
            exit;
        // プログラム内のシステム用例外
        } catch (OtherException $e) {
            if ($this->_logger != null) {
                $this->_logger->outErrLog('The Other Error occurred. ' . $e->getFile().":". 
                                                $e->getLine().":".$e->getMessage(), Zend_Log::ERR);
                echo 'Sys : Message: ' . 'The Other Error occurred. ' . "<br />\n";
            } else {
                echo 'Sys : Message: ' . 'The Other Error occurred. And logger = null.' . "<br />\n";
            }
            // DB rollback(継承先でDB使わないときは何もしない)
            $this->_dbRollback();
            exit;
        // ZENDなどが出す例外
        } catch (Exception $e) {
            if ($this->_logger != null) {
                $this->_logger->outErrLog('The Error occurred. ' . $e->getFile().":". 
                                            $e->getLine().":".$e->getMessage(), Zend_Log::ERR);
                echo ' Message: ' . 'The Error occurred. ' . "<br />\n";
            } else {
                echo ' Message: ' . 'The Error occurred. And logger = null.' . "<br />\n";
            }
            // DB rollback(継承先でDB使わないときは何もしない)
            $this->_dbRollback();
            exit;
        }
    }

■Exceptionクラスはこれ。・・・といっても継承しているだけ。


・AppException.php
<?php
/** Zend_Exception */
require_once 'Zend/Exception.php';
/**
* @copyright 2010 kaz PHP自動作成◎自動生成お助けTOOL.
* @license New BSD License
*/
class AppException extends Zend_Exception
{}

・SysException.php
<?php
/** Zend_Exception */
require_once 'Zend/Exception.php';
/**
* @copyright 2010 kaz PHP自動作成◎自動生成お助けTOOL.
* @license New BSD License
*/
class SysException extends Zend_Exception
{}

・OtherException.php
<?php
/** Zend_Exception */
require_once 'Zend/Exception.php';
/**
* @copyright 2010 kaz PHP自動作成◎自動生成お助けTOOL.
* @license New BSD License
*/
class OtherException extends Zend_Exception
{}

そのた:
・PHP5になったのでExceptionで処理する。もう自作「common.php」の


error_reporting(E_ALL ^ E_NOTICE);
$old_error_handler = set_error_handler("userErrorHandler", E_ALL ^ E_NOTICE);
は使わない。<=6/5 WarningのときExceptionにならないので、やはりset_error_handlerを使うことにした。Exceptionが拾わないエラーをここで拾うことにする。

・これを使うとZend Frameworkのindex.phpでの例外は try、catchでExceptionを拾おうとしてもset_error_handlerのほうが先にうごくみたいだ。controllersのindexAction()ではset_error_handlerより先にcatchでExceptionを拾えるみたいだ。
・どちらにしてもset_error_handlerはもう使わないということになる。 <=6/5 使うことにした。具体的にはこんな感じ。WarningのときOtherExceptionを起こさせた。

■common.php
・・・
// エラーハンドリング
function userErrorHandler ($errno, $errmsg, $filename, $linenum, $vars) {
	global $db;

    // エラー文字列の連想を定義
    // 実際に考慮するエントリは 2,8,256,512,1024のみ
    $errortype = array (
                1   =>  "Error",
                2   =>  "Warning",
                4   =>  "Parsing Error",
                8   =>  "Notice",
                16  =>  "Core Error",
                32  =>  "Core Warning",
                64  =>  "Compile Error",
                128 =>  "Compile Warning",
                256 =>  "User Error",
                512 =>  "User Warning",
                1024=>  "User Notice"
                );
    // プログラムエラー
	$msg = ' Errno: ' . $errno . ' Errortype: ' . 
	$errortype[$errno] . "\n" .
	' Message: ' . $errmsg . "\n" .
	' Filename: ' . $filename . "\n" .
	' Linenum: ' . $linenum;
    throw new OtherException($msg);
}
// 独自のエラー処理(E_NOTICE以外)を行う
error_reporting(E_ALL ^ E_NOTICE);
$old_error_handler = set_error_handler("userErrorHandler", E_ALL ^ E_NOTICE);

■adminIndex.php
<?php
define('APP', dirname(__FILE__) . '../../../.kazphp/application');
//require_once 'Zend/Controller/Action.php';
//require_once 'Zend/Controller/Plugin/ErrorHandler.php';
require_once 'Zend/Log.php';
require_once 'Zend/Log/Writer/Stream.php';
require_once 'Zend/Controller/Front.php';
require_once 'Zend/Registry.php';
require_once 'Zend/Session.php';

// ユーザ&管理者 共通部分読込(設定ファイル、共通関数など)
require_once(dirname(__FILE__) . '/../../.kazphp/common.php');
require_once('AppLogr.php');
require_once('AppException.php');
require_once('SysException.php');
require_once('OtherException.php');

try {
    require_once('AppCheckUtil.php');
    require_once('AppSrchUtil.php');
    require_once('TokenHandle.php');
    require_once('AppElements.php');

    $front = Zend_Controller_Front::getInstance();
    $front->setControllerDirectory(
        array(
            'default'  => APP.'/admin/default',
            'logininfo'  => APP.'/admin/logininfo',
            'item'  => APP.'/admin/item'
        )
    );
    // 自動レンダリングを行いません
    $front->setParam('noViewRenderer', TRUE);
    $front->dispatch();
} catch (Exception $e) {
    // ログ
    $logger = new AppLogr(DIR_LOG, DEBUG_FLG);
    $logger->outErrLog($e->getFile().":". $e->getLine().":".$e->getMessage(), Zend_Log::ERR);
    echo 'Sys : Message: ' . 'The Other Error occurred. ' . "<br />\n";
    exit;
}

・このとき使ったZend Frameworkのindex.phpのハードコピー。(404(URLNotFound)を拾う予定だった。違うやり方("defalt"でErrorController.phpを使う)で拾うことにしたのでこの方法はボツにした。)<=6/5 上記のとおり、WarningのときExceptionにならないので、やはりset_error_handlerを使うことにした。WarningのときOtherExceptionを起こさせた。

そのた2:
・このときのViewのロジックおよび仕組みは「kaz PHP自動作成◎自動生成おたすけTOOL」のVer0.1のままだ。さほど変更しないで動く。(URLの書き方が違うので変更したぐらい)。PHPの持っている柔軟性はZendFrameworkでも健在だった。
・自作Ver0.1のFrameWorkのViewはfunctionにしている。パラメータにより受け渡される変数が明確である。かつ、使用するグローバルも明確にすることになる。これによりバグを防ごうという考えだ。自分的には気に入っている。 <=6/5 最終的にはsmartyを使うことにした。(サニタイズ漏れを防ぐのに都合がいいから。)
・ViewをSmartyにしないのはphp自体がscript言語なのに別のscript言語にする理由が思いつかないから。(メールのテンプレートにはSmarty使っている。これからも使うつもり。ロジックを使わないものなら使うというスタンス。)使用するプログラム言語を集約することによりバグを防ぐという考え。 <=6/5 最終的にはsmartyを使うことにした。(script言語としても簡単なことしかやらないので。)
・ZendFrameworkはViewに対して$this->view->xxxというようにクラス変数を渡そうとしている。クラス変数は動的に作れるのでバグを防ごうというためには弱いと思う。でもひとところに固めてコーディングするという決まりにすればバグ防止になるだろう。
・とか考えるが、自作FrameworkのViewはZendViewに置き換えることにする。とりあえずやってから考える。 <=6/5 最終的にはsmartyを使うことにした。

http://kazpgm.ddo.jp/

01/19 21:00-01:30
6/5 23:00-1:30 WarningのときExceptionにならないので、やはりset_error_handlerを使うことにした。WarningのときOtherExceptionを起こさせた。Exceptionが拾わないエラーをここで拾うことにした。
8/14 10:30-10-40 adminIndex.phpの内容がちょっと古くなっていたので最新にした。「■使い方はこんな感じ」の内容も最新にした。