33.错误处理(2)

这里写图片描述

1.错误处理

发生错误后引发 handleError() 函数处理:

public function handleError($code,$message,$file,$line)
    {
        if($code & error_reporting())
        {
            // disable error capturing to avoid recursive errors
            restore_error_handler(); 
            restore_exception_handler();
            //restore_error_handler,
restore_exception_handler两个函数,如果没有这两个函数的调用,那么在后续的错误处理过程中,
当再次产生异常或是错误时,又会调用CApplication:: handleError ,从而可能造成死循环,
故Yii在此处临时禁止了使用CApplication:: handleError 接管后续的错误和异常(使用php默认的错误处理机制),
这就保证了不会因之产生循环调用。

            $log="$message ($file:$line)\nStack trace:\n";
            $trace=debug_backtrace();
            // skip the first 3 stacks as they do not tell the error position
            if(count($trace)>3) {
                $trace=array_slice($trace,3);
            }
            foreach($trace as $i=>$t)
            {
                if(!isset($t['file'])) {
                    $t['file']='unknown';
                }
                if(!isset($t['line'])) {
                    $t['line']=0;
                }
                if(!isset($t['function'])) {
                    $t['function']='unknown';
                }
                $log.="#$i {$t['file']}({$t['line']}): ";
                if(isset($t['object']) && is_object($t['object'])) {
                    $log.=get_class($t['object']).'->';
                }
                $log.="{$t['function']}()\n";
            }
            if(isset($_SERVER['REQUEST_URI'])) {
                $log.='REQUEST_URI='.$_SERVER['REQUEST_URI'];
            }
            Yii::log($log,CLogger::LEVEL_ERROR,'php');

            try
            {
                Yii::import('CErrorEvent',true);
                $event=new CErrorEvent($this,$code,$message,$file,$line);
                //此时将产生一个CErrorEvent(并包含$code,$message,$file,$line几项关键参数),
                传递给CErrorHandler组件进行处理。具体是交给CErrorHandler::handleError处理之
                。这个流程主要是将错误相关信息进行整理,并以合适的方式进行显示。
                $this->onError($event);
                if(!$event->handled)
                {
                    // try an error handler
                    if(($handler=$this->getErrorHandler())!==null) {
                        $handler->handle($event);
                    }
                    else {
                        $this->displayError($code,$message,$file,$line);
                    }
                }
            }
            catch(Exception $e)
            {
                $this->displayException($e);
            }

            try
            {
                $this->end(1);
            }
            catch(Exception $e)
            {
                // use the most primitive way to log error
                $msg = get_class($e).': '.$e->getMessage().' ('.$e->getFile().':'.$e->getLine().")\n";
                $msg .= $e->getTraceAsString()."\n";
                $msg .= "Previous error:\n";
                $msg .= $log."\n";
                $msg .= '$_SERVER='.var_export($_SERVER,true);
                error_log($msg);
                exit(1);
            }
        }
    }

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述


2.异常处理
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述


3.使用一个动作来处理错误
这里写图片描述
这里写图片描述
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值