3

フレームワークにエラー処理の実装を開始し、それを構築する方法に関するアドバイスを探しています。

まず、私のフレームワークが現在どのように構築されているかを説明しましょう。

フレームワークの起動をアプリケーションの起動から分離しているため、アプリケーションの起動中に発生したエラーは、専用のクラスによって具体的に処理する必要があります。

私の考えは、私のフレームワークがPHP 5.3のエラーに厳密であるため、 witchというクラスCore_Error_exceptionにエラー報告を設定することです。次に、アプリケーションの負荷として、そのクラス内でシャットダウン関数関数を実行して、変更されたすべてのデフォルト値を復元します。 .E_ALL

私がやろうとしているのは、すべてのエラーをキャプチャすることですE_*_NOTICE。アプリケーションが起動する前に、エラーを監視するため、エラーE_*_ERRORのキャプチャを停止するようにクラスに指示します。Application_Error_Exception

したがって、例外やトリガーを含むすべてのエラーを追跡し、アプリケーションが初期化される前にフレームワークのデバッグ ページを表示する方法が必要になります。

私が探していた種類のクラスは次のようなものです:

class Core_Error_Exception
{
    var $previus_error_level,$captured_contents;

    private $stack_trace = array();

    public function Core_Error_Exception()
    {
        $this->previus_error_level = error_reporting(-1);
        set_error_handler(array($this,'_collect_error'));
        set_exception_handler(array($this,'_collect_error'));
        ob_start(array($this,'_capture'));
    }

    public function _collect_error($errno, $errstr, $errfile, $errline, $context)
    {
        $this->stack_trace[] = array(
            array('name' => 'Error ID:',    'value' => $errno),
            array('name' => 'Error String:','value' => $errstr),
            array('name' => 'Error File:',  'value' => $errfile),
            array('name' => 'Error Line:',  'value' => $errline),
            array('name' => 'Context PRE:', 'value' => $context)
        );
        var_dump($this->stack_trace);
    }

    /*
     * _capture is used to capture pre_bufferd content.
     */
    public function _capture($content,$bitfeild)
    {
        if($bitfeild & PHP_OUTPUT_HANDLER_START)
        {
            $this->captured_contents = $content;
        }

        if($bitfeild & PHP_OUTPUT_HANDLER_CONT)
        {
            $this->captured_contents .= $content;
        }

        if($bitfeild & PHP_OUTPUT_HANDLER_END)
        {
            $this->captured_contents .= $content;
        }
        return false;
    }
}

したがって、E_ERROR通知が呼び出された場合、これにより自動的にshut-より多くのエラーが発生するのを防ぐために、その時点でダウンします。

そのコンテキスト セットのエラーに渡すことができる小さな html テンプレート ハンドラーを使用しますE_*_ERROR

過去にエラー追跡/レポートを行うのに苦労したので、このクラスを構築する最良の方法は何ですか.

更新: 現在のクラスで

trigger_error('test',XXX); などのエラーが発生した場合。アプリケーションが起動するまで、または E_USER_ERROR がトリガーされるまで、すべてのエラーを追跡できるようにしたいと考えています。

PHP のエラー システムを完全に把握するのに苦労することもあります。

4

2 に答える 2

3

あなたが何をしているのかよくわかりませんが、最も簡単な方法は、ネストされた try ブロックを次のように使用することです。

in Class Application:

    function run() {
        try {
            --do stuff
        } catch(AppException $e) {
            -- handle application-level exception
        }
        -- all other exceptions fall through


in Class Core:

    try {
        $core->init();
        $application->run(); <-- calls the above function
        $core->done();
    } catch(Exception $e) {
        --last chance exception handler
        --process exceptions the Application was unable to handle on its own
    }

trigger_errorこの方法で PHP の組み込みエラーまたはイベントをキャッチできるようにするには、常にエラーから例外へのハンドラもインストールする必要があります。

于 2010-09-25T09:55:56.650 に答える
0

あなたが持っているものはかなり堅実に見えます。ロジックを追加して、スクリプトをシャットダウンするエラーがスローされたときに、出力を ob バッファーにフラッシュし、収集したすべてのデータをエラー HTML ファイルに送信してトレースを表示する必要があります。何かのようなもの:

public function _collect_error($errno, $errstr, $errfile, $errline, $context)
{
    $this->stack_trace[] = array(
        array('name' => 'Error ID:',    'value' => $errno),
        array('name' => 'Error String:','value' => $errstr),
        array('name' => 'Error File:',  'value' => $errfile),
        array('name' => 'Error Line:',  'value' => $errline),
        array('name' => 'Context PRE:', 'value' => $context)
    );

    if($errno == E_USER_ERROR) {
        ob_clean();
        // Pass collected data to HTML template
        // Display HTML
        exit();
    }

    var_dump($this->stack_trace);
}

致命的なエラーから正常に回復できると100%確信しているわけではありませんが、あなたが言っていることから、処理をシャットダウンするために特定の致命的ではないエラーを探しているだけです。

また、バッファリングされたコンテンツをキャプチャする意図は何ですか? 探しているエラーがヒットしないか、スローされてエラー画面が表示された場合に表示されると思います(エラー関数にob_cleanを追加した理由)?

于 2010-09-25T14:23:51.113 に答える