代码之家  ›  专栏  ›  技术社区  ›  RobertPitt

对我的框架实现错误处理

  •  3
  • RobertPitt  · 技术社区  · 14 年前

    首先让我解释一下我的框架是如何建立起来的:

    我将框架启动与应用程序启动分开,因此应用程序启动中引起的任何错误都应该由专用于该类的类专门处理。

    我的想法是开一个叫 Core_Error_exception witch将错误报告设置为 E_ALL 因为我的框架会对错误进行严格的检查 ,则在加载应用程序时,我将在该类中运行shutdown函数,以恢复所有更改的默认值。

    我想做的是捕捉所有的错误 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\u错误通知,那么它将在该点自动运行关闭,以防止引起更多错误。

    我将使用一个小的html模板处理程序,在这里我可以将一组错误传递到上下文中,因此请注意错误和一个 E*U错误

    构建这个类的最佳方法是什么就像过去一样,我在做错误跟踪/报告时遇到了一些困难。

    更新

    如果触发了错误,例如trigger\u error('test',XXX);我希望能够跟踪所有错误,直到应用程序启动或触发E\u USER\u错误。

    有时我很难完全理解PHP的错误系统,有时我会对如何构建它以防坠落感到困惑。

    2 回复  |  直到 14 年前
        1
  •  3
  •   user187291    14 年前

    我不太清楚您在做什么,但是最直接的方法是使用嵌套的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
        }
    

    能够捕捉php内置错误或 trigger_error 这样,您还应该始终安装 errors-to-exceptions handler .

        2
  •  0
  •   methodin    14 年前

    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%肯定你能从一个致命的错误中恢复过来,但是从你所说的你只是在寻找特定的非致命错误来关闭处理。