Spec-Zone.ru › Yii 1.1

CErrorHandler

Пакет system.base
Наследование class CErrorHandler » CApplicationComponent » CComponent
Реализует IApplicationComponent
С версии 1.0
Исходный код framework/base/CErrorHandler.php
CErrorHandler обрабатывает неперехваченные PHP ошибки и исключения.

Он отображает эти ошибки с помощью соответствующих представлений, основанных на характере ошибки и режиме работы приложения. Также он выбирает наиболее предпочтительный язык для отображения ошибки.

CErrorHandler использует два набора представлений:
  • представления для разработки, имеющие имена exception.php;
  • представления для производства, имеющие имена error<StatusCode>.php;
где <StatusCode> обозначает код HTTP ошибки (например, error500.php). Локализованные представления имеют аналогичное имя, но находятся в подкаталоге с кодом языка (например, zh_cn/error500.php).

Представления для разработки отображаются, когда приложение находится в режиме отладки (т.е. YII_DEBUG определён как true). В этих представлениях отображается подробная информация об ошибке с исходным кодом. Представления для производства предназначены для отображения конечным пользователям и используются, когда приложение находится в режиме производства. По соображениям безопасности они отображают только сообщение об ошибке без какой-либо конфиденциальной информации.

CErrorHandler ищет шаблоны представлений в следующих расположениях в указанном порядке:
  1. themes/ThemeName/views/system: когда активна тема.
  2. protected/views/system
  3. framework/views
Если представление не найдено в директории, оно будет ищется в следующей.

Свойство maxSourceLines может быть изменено для указания количества строк исходного кода, которые нужно отобразить в представлениях для разработки.

CErrorHandler — это основной компонент приложения, к которому можно получить доступ через CApplication::getErrorHandler().

Свойства public

Свойство Тип Описание Определено в
adminInfo string информация об администраторе приложения (может быть именем или ссылкой на электронную почту). CErrorHandler
behaviors array поведения, которые должны быть подключены к этому компоненту. CApplicationComponent
discardOutput boolean указывает, нужно ли игнорировать существующий вывод страницы перед отображением ошибки. CErrorHandler
error array Возвращает детали ошибки, которая в данный момент обрабатывается. CErrorHandler
errorAction string маршрут (например, 'site/error') к действию контроллера, который будет использоваться для отображения внешних ошибок. CErrorHandler
exception Exception|null Возвращает экземпляр исключения, который в данный момент обрабатывается. CErrorHandler
isInitialized boolean Проверяет, был ли инициализирован данный компонент приложения. CApplicationComponent
maxSourceLines integer максимальное количество строк исходного кода для отображения. CErrorHandler
maxTraceSourceLines integer максимальное количество строк кода трассировки для отображения. CErrorHandler

Свойства protected

Свойство Тип Описание Определено в
versionInfo string Возвращает информацию о версии сервера. CErrorHandler

Методы public

Метод Описание Определено в
__call() Вызывает метод, который не является методом класса. CComponent
__get() Возвращает значение свойства, список обработчиков событий или поведения на основе его имени. CComponent
__isset() Проверяет, является ли значение свойства нулевым. CComponent
__set() Устанавливает значение свойства компонента. CComponent
__unset() Устанавливает свойство компонента в null. CComponent
asa() Возвращает объект поведения по имени. CComponent
attachBehavior() Подключает поведение к этому компоненту. CComponent
attachBehaviors() Подключает список поведений к компоненту. CComponent
attachEventHandler() Подключает обработчик событий к событию. CComponent
canGetProperty() Определяет, можно ли читать свойство. CComponent
canSetProperty() Определяет, можно ли установить свойство. CComponent
detachBehavior() Отключает поведение от компонента. CComponent
detachBehaviors() Отключает все поведения от компонента. CComponent
detachEventHandler() Отключает существующий обработчик событий. CComponent
disableBehavior() Отключает подключенное поведение. CComponent
disableBehaviors() Отключает все подключенные поведения к этому компоненту. CComponent
enableBehavior() Включает подключенное поведение. CComponent
enableBehaviors() Включает все подключенные поведения к этому компоненту. CComponent
evaluateExpression() Вычисляет PHP выражение или обратный вызов в контексте этого компонента. CComponent
getError() Возвращает детали обрабатываемой ошибки. CErrorHandler
getEventHandlers() Возвращает список подключённых обработчиков событий для события. CComponent
getException() Возвращает экземпляр исключения, который в данный момент обрабатывается. CErrorHandler
getIsInitialized() Проверяет, был ли инициализирован данный компонент приложения. CApplicationComponent
handle() Обрабатывает событие исключения/ошибки. CErrorHandler
hasEvent() Определяет, определено ли событие. CComponent
hasEventHandler() Проверяет, есть ли у события подключённые обработчики. CComponent
hasProperty() Определяет, определено ли свойство. CComponent
init() Инициализирует компонент приложения. CApplicationComponent
raiseEvent() Вызывает событие. CComponent

Защищённые методы

Метод Описание Определено в
argumentsToString() Преобразует массив аргументов в строковое представление CErrorHandler
getExactTrace() Возвращает точный трассировку, где возникает проблема. CErrorHandler
getHttpHeader() Возвращает правильное сообщение для каждого известного кода HTTP-ошибки CErrorHandler
getVersionInfo() Возвращает информацию о версии сервера. CErrorHandler
getViewFile() Определяет, какой файл представления следует использовать. CErrorHandler
getViewFileInternal() Ищет представление в указанном каталоге. CErrorHandler
handleError() Обрабатывает ошибку PHP. CErrorHandler
handleException() Обрабатывает исключение. CErrorHandler
isAjaxRequest() указывает, является ли текущий запрос AJAX-запросом (XMLHttpRequest). CErrorHandler
isCoreCode() Возвращает значение, указывающее, происходит ли вызов из кода приложения. CErrorHandler
render() Отображает представление. CErrorHandler
renderError() Отображает текущую информацию об ошибке. CErrorHandler
renderException() Отображает информацию об исключении. CErrorHandler
renderSourceCode() Отображает исходный код вокруг строки ошибки. CErrorHandler

Подробное описание свойств

adminInfo свойство

public string $adminInfo;

информация об администраторе приложения (может быть имя или ссылка на электронную почту). Она отображается на страницах ошибок для конечных пользователей. По умолчанию установлено значение 'the webmaster'.

discardOutput свойство

public boolean $discardOutput;

указывает, следует ли отбрасывать существующий вывод страницы перед отображением ошибки. По умолчанию установлено значение true.

error свойство только для чтения

public array getError()

Возвращает подробности об ошибке, которая в настоящее время обрабатывается. Ошибка возвращается в виде массива со следующей информацией:

  • code - код HTTP-статуса (например, 403, 500)
  • type - тип ошибки (например, 'CHttpException', 'PHP Error')
  • message - сообщение об ошибке
  • file - имя файла PHP-скрипта, где произошла ошибка
  • line - номер строки кода, где произошла ошибка
  • trace - стек вызовов ошибки
  • source - исходный код контекста, где произошла ошибка

errorAction свойство

public string $errorAction;

маршрут (например, 'site/error') к действию контроллера, который будет использоваться для отображения внешних ошибок. Внутри действия можно получить информацию об ошибке, используя Yii::app()->errorHandler->error. По умолчанию значение null, что означает CErrorHandler будет обрабатывать отображение ошибки.

exception свойство только для чтения

public Exception|null getException()

Возвращает экземпляр исключения, которое в настоящее время обрабатывается.

maxSourceLines свойство

public integer $maxSourceLines;

максимальное количество строк исходного кода для отображения. По умолчанию установлено значение 25.

maxTraceSourceLines свойство (доступно начиная с v1.1.6)

public integer $maxTraceSourceLines;

максимальное количество строк исходного кода трассировки для отображения. По умолчанию установлено значение 10.

versionInfo свойство только для чтения

protected string getVersionInfo()

Возвращает информацию о версии сервера. Если приложение находится в режиме производства, возвращается пустая строка.

Подробное описание методов

argumentsToString() метод

protected string argumentsToString(array $args)
$args array массив аргументов для преобразования
{return} string строковое представление массива аргументов
Исходный код: framework/base/CErrorHandler.php#452 (показать)
protected function argumentsToString($args)
{
    
$count=0;

    
$isAssoc=$args!==array_values($args);

    foreach(
$args as $key => $value)
    {
        
$count++;
        if(
$count>=5)
        {
            if(
$count>5)
                unset(
$args[$key]);
            else
                
$args[$key]='...';
            continue;
        }

        if(
is_object($value))
            
$args[$key] = get_class($value);
        elseif(
is_bool($value))
            
$args[$key] = $value ? 'true' : 'false';
        elseif(
is_string($value))
        {
            if(
strlen($value)>64)
                
$args[$key] = '"'.substr($value,0,64).'..."';
            else
                
$args[$key] = '"'.$value.'"';
        }
        elseif(
is_array($value))
            
$args[$key] = 'array('.$this->argumentsToString($value).')';
        elseif(
$value===null)
            
$args[$key] = 'null';
        elseif(
is_resource($value))
            
$args[$key] = 'resource';

        if(
is_string($key))
        {
            
$args[$key] = '"'.$key.'" => '.$args[$key];
        }
        elseif(
$isAssoc)
        {
            
$args[$key] = $key.' => '.$args[$key];
        }
    }
    
$out = implode(", ", $args);

    return 
$out;
}

Преобразует массив аргументов в строковое представление

getError() метод

public array getError()
{return} array подробности об ошибке. Null, если ошибка отсутствует.
Исходный код: framework/base/CErrorHandler.php#150 (показать)
public function getError()
{
    return 
$this->_error;
}

Возвращает подробности об ошибке, которая в настоящее время обрабатывается. Ошибка возвращается в виде массива со следующей информацией:

  • code - код HTTP-статуса (например, 403, 500)
  • type - тип ошибки (например, 'CHttpException', 'PHP Error')
  • message - сообщение об ошибке
  • file - имя файла PHP-скрипта, где произошла ошибка
  • line - номер строки кода, где произошла ошибка
  • trace - стек вызовов ошибки
  • source - исходный код контекста, где произошла ошибка

getExactTrace() метод

protected array getExactTrace(Exception $exception)
$exception Exception необработанное исключение
{return} array точная трассировка, где возникла проблема
Исходный код: framework/base/CErrorHandler.php#316 (показать)
protected function getExactTrace($exception)
{
    
$traces=$exception->getTrace();

    foreach(
$traces as $trace)
    {
        
// property access exception
        
if(isset($trace['function']) && ($trace['function']==='__get' || $trace['function']==='__set'))
            return 
$trace;
    }
    return 
null;
}

Возвращает точный трассировку, где возникает проблема.

getException() метод

public Exception|null getException()
{return} Exception|null экземпляр исключения. Null, если исключение отсутствует.
Исходный код: framework/base/CErrorHandler.php#159 (показать)
public function getException()
{
    return 
$this->_exception;
}

Возвращает экземпляр исключения, которое в настоящее время обрабатывается.

getHttpHeader() метод

protected string getHttpHeader(integer $httpCode, string $replacement='')
$httpCode integer код ошибки для отображения
$replacement string замена для строки ошибки, если код не известен
{return} string текстовое представление заданного кода ошибки или строка замены, если код ошибки неизвестен
Исходный код: framework/base/CErrorHandler.php#553 (показать)
protected function getHttpHeader($httpCode, $replacement='')
{
    
$httpCodes = array(
        
100 => 'Continue',
        
101 => 'Switching Protocols',
        
102 => 'Processing',
        
118 => 'Connection Timed Out',
        
200 => 'OK',
        
201 => 'Created',
        
202 => 'Accepted',
        
203 => 'Non-Authoritative',
        
204 => 'No Content',
        
205 => 'Reset Content',
        
206 => 'Partial Content',
        
207 => 'Multi-Status',
        
210 => 'Content Different',
        
300 => 'Multiple Choices',
        
301 => 'Moved Permanently',
        
302 => 'Found',
        
303 => 'See Other',
        
304 => 'Not Modified',
        
305 => 'Use Proxy',
        
307 => 'Temporary Redirect',
        
310 => 'Too Many Redirect',
        
400 => 'Bad Request',
        
401 => 'Unauthorized',
        
402 => 'Payment Required',
        
403 => 'Forbidden',
        
404 => 'Not Found',
        
405 => 'Method Not Allowed',
        
406 => 'Not Acceptable',
        
407 => 'Proxy Authentication Required',
        
408 => 'Request Timeout',
        
409 => 'Conflict',
        
410 => 'Gone',
        
411 => 'Length Required',
        
412 => 'Precondition Failed',
        
413 => 'Request Entity Too Large',
        
414 => 'Request-URI Too Long',
        
415 => 'Unsupported Media Type',
        
416 => 'Requested Range Not Satisfiable',
        
417 => 'Expectation Failed',
        
418 => 'I’m a teapot',
        
422 => 'Unprocessable entity',
        
423 => 'Locked',
        
424 => 'Method failure',
        
425 => 'Unordered Collection',
        
426 => 'Upgrade Required',
        
428 => 'Precondition Required',
        
429 => 'Too Many Requests',
        
431 => 'Request Header Fields Too Large',
        
449 => 'Retry With',
        
450 => 'Blocked by Windows Parental Controls',
        
451 => 'Unavailable For Legal Reasons',
        
500 => 'Internal Server Error',
        
501 => 'Not Implemented',
        
502 => 'Bad Gateway',
        
503 => 'Service Unavailable',
        
504 => 'Gateway Timeout',
        
505 => 'HTTP Version Not Supported',
        
507 => 'Insufficient Storage',
        
509 => 'Bandwidth Limit Exceeded',
        
510 => 'Not Extended',
        
511 => 'Network Authentication Required',
    );
    if(isset(
$httpCodes[$httpCode]))
        return 
$httpCodes[$httpCode];
    else
        return 
$replacement;
}

Возвращает правильное сообщение для каждого известного кода HTTP-ошибки

getVersionInfo() метод

protected string getVersionInfo()
{return} string информация о версии сервера. Пустая строка, если приложение в режиме производства.
Исходный код: framework/base/CErrorHandler.php#433 (показать)
protected function getVersionInfo()
{
    if(
YII_DEBUG)
    {
        
$version='<a href="http://www.yiiframework.com/">Yii Framework</a>/'.Yii::getVersion();
        if(isset(
$_SERVER['SERVER_SOFTWARE']))
            
$version=$_SERVER['SERVER_SOFTWARE'].' '.$version;
    }
    else
        
$version='';
    return 
$version;
}

Возвращает информацию о версии сервера. Если приложение в режиме производства, возвращается пустая строка.

getViewFile() метод

protected string getViewFile(string $view, integer $code)
$view string имя представления ('exception' или 'error')
$code integer код HTTP-статуса
{return} string путь к файлу представления
Исходный код: framework/base/CErrorHandler.php#387 (показать)
protected function getViewFile($view,$code)
{
    
$viewPaths=array(
        
Yii::app()->getTheme()===null ? null :  Yii::app()->getTheme()->getSystemViewPath(),
        
Yii::app() instanceof CWebApplication ? Yii::app()->getSystemViewPath() : null,
        
YII_PATH.DIRECTORY_SEPARATOR.'views',
    );

    foreach(
$viewPaths as $i=>$viewPath)
    {
        if(
$viewPath!==null)
        {
             
$viewFile=$this->getViewFileInternal($viewPath,$view,$code,$i===2?'en_us':null);
             if(
is_file($viewFile))
                  return 
$viewFile;
        }
    }
}

Определяет, какой файл представления следует использовать.

getViewFileInternal() метод

protected string getViewFileInternal(string $viewPath, string $view, integer $code, string $srcLanguage=NULL)
$viewPath string директория, содержащая представления
$view string имя представления (либо 'exception', либо 'error')
$code integer код HTTP-статуса
$srcLanguage string язык файла представления
{return} string путь к файлу представления
Исходный код: framework/base/CErrorHandler.php#414 (показать)
protected function getViewFileInternal($viewPath,$view,$code,$srcLanguage=null)
{
    
$app=Yii::app();
    if(
$view==='error')
    {
        
$viewFile=$app->findLocalizedFile($viewPath.DIRECTORY_SEPARATOR."error{$code}.php",$srcLanguage);
        if(!
is_file($viewFile))
            
$viewFile=$app->findLocalizedFile($viewPath.DIRECTORY_SEPARATOR.'error.php',$srcLanguage);
    }
    else
        
$viewFile=$viewPath.DIRECTORY_SEPARATOR."exception.php";
    return 
$viewFile;
}

Ищет представление в указанной директории.

handle() метод

public void handle(CEvent $event)
$event CEvent событие, содержащее информацию об исключении/ошибке
Исходный код: framework/base/CErrorHandler.php#94 (показать)
public function handle($event)
{
    
// set event as handled to prevent it from being handled by other event handlers
    
$event->handled=true;

    if(
$this->discardOutput)
    {
        
$gzHandler=false;
        foreach(
ob_list_handlers() as $h)
        {
            if(
strpos($h,'gzhandler')!==false)
                
$gzHandler=true;
        }
        
// the following manual level counting is to deal with zlib.output_compression set to On
        // for an output buffer created by zlib.output_compression set to On ob_end_clean will fail
        
for($level=ob_get_level();$level>0;--$level)
        {
            if(!@
ob_end_clean())
                
ob_clean();
        }
        
// reset headers in case there was an ob_start("ob_gzhandler") before
        
if($gzHandler && !headers_sent() && ob_list_handlers()===array())
        {
            if(
function_exists('header_remove')) // php >= 5.3
            
{
                
header_remove('Vary');
                
header_remove('Content-Encoding');
            }
            else
            {
                
header('Vary:');
                
header('Content-Encoding:');
            }
        }
    }

    if(
$event instanceof CExceptionEvent)
        
$this->handleException($event->exception);
    else 
// CErrorEvent
        
$this->handleError($event);
}

Обрабатывает событие исключения/ошибки. Этот метод вызывается приложением всякий раз, когда оно ловит исключение или ошибку PHP.

handleError() метод

protected void handleError(CErrorEvent $event)
$event CErrorEvent событие ошибки PHP
Исходный код: framework/base/CErrorHandler.php#228 (показать)
protected function handleError($event)
{
    
$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);
    
$traceString='';
    foreach(
$trace as $i=>$t)
    {
        if(!isset(
$t['file']))
            
$trace[$i]['file']='unknown';

        if(!isset(
$t['line']))
            
$trace[$i]['line']=0;

        if(!isset(
$t['function']))
            
$trace[$i]['function']='unknown';

        
$traceString.="#$i{$trace[$i]['file']}({$trace[$i]['line']}): ";
        if(isset(
$t['object']) && is_object($t['object']))
            
$traceString.=get_class($t['object']).'->';
        
$traceString.="{$trace[$i]['function']}()\n";

        unset(
$trace[$i]['object']);
    }

    
$app=Yii::app();
    if(
$app instanceof CWebApplication)
    {
        switch(
$event->code)
        {
            case 
E_WARNING:
                
$type = 'PHP warning';
                break;
            case 
E_NOTICE:
                
$type = 'PHP notice';
                break;
            case 
E_USER_ERROR:
                
$type = 'User error';
                break;
            case 
E_USER_WARNING:
                
$type = 'User warning';
                break;
            case 
E_USER_NOTICE:
                
$type = 'User notice';
                break;
            case 
E_RECOVERABLE_ERROR:
                
$type = 'Recoverable error';
                break;
            default:
                
$type = 'PHP error';
        }
        
$this->_exception=null;
        
$this->_error=array(
            
'code'=>500,
            
'type'=>$type,
            
'message'=>$event->message,
            
'file'=>$event->file,
            
'line'=>$event->line,
            
'trace'=>$traceString,
            
'traces'=>$trace,
        );
        if(!
headers_sent())
        {
            
$httpVersion=Yii::app()->request->getHttpVersion();
            
header("HTTP/$httpVersion 500 Internal Server Error");
        }

        
$this->renderError();
    }
    else
        
$app->displayError($event->code,$event->message,$event->file,$event->line);
}

Обрабатывает ошибку PHP.

handleException() метод

protected void handleException(Exception $exception)
$exception Exception пойманное исключение
Исходный код: framework/base/CErrorHandler.php#168 (показать)
protected function handleException($exception)
{
    
$app=Yii::app();
    if(
$app instanceof CWebApplication)
    {
        if((
$trace=$this->getExactTrace($exception))===null)
        {
            
$fileName=$exception->getFile();
            
$errorLine=$exception->getLine();
        }
        else
        {
            
$fileName=$trace['file'];
            
$errorLine=$trace['line'];
        }

        
$trace = $exception->getTrace();

        foreach(
$trace as $i=>$t)
        {
            if(!isset(
$t['file']))
                
$trace[$i]['file']='unknown';

            if(!isset(
$t['line']))
                
$trace[$i]['line']=0;

            if(!isset(
$t['function']))
                
$trace[$i]['function']='unknown';

            unset(
$trace[$i]['object']);
        }

        
$this->_exception=$exception;
        
$this->_error=$data=array(
            
'code'=>($exception instanceof CHttpException)?$exception->statusCode:500,
            
'type'=>get_class($exception),
            
'errorCode'=>$exception->getCode(),
            
'message'=>$exception->getMessage(),
            
'file'=>$fileName,
            
'line'=>$errorLine,
            
'trace'=>$exception->getTraceAsString(),
            
'traces'=>$trace,
        );

        if(!
headers_sent())
        {
            
$httpVersion=Yii::app()->request->getHttpVersion();
            
header("HTTP/$httpVersion{$data['code']} ".$this->getHttpHeader($data['code'], get_class($exception)));
        }

        
$this->renderException();
    }
    else
        
$app->displayException($exception);
}

Обрабатывает исключение.

isAjaxRequest() метод

protected boolean isAjaxRequest()
{return} boolean является ли текущий запрос AJAX-запросом.
Исходный код: framework/base/CErrorHandler.php#306 (показать)
protected function isAjaxRequest()
{
    return isset(
$_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest';
}

является ли текущий запрос AJAX (XMLHttpRequest)-запросом.

isCoreCode() метод

protected boolean isCoreCode(array $trace)
$trace array данные трассировки
{return} boolean является ли стек вызовов из кода приложения.
Исходный код: framework/base/CErrorHandler.php#507 (показать)
protected function isCoreCode($trace)
{
    if(isset(
$trace['file']))
    {
        
$systemPath=realpath(dirname(__FILE__).'/..');
        return 
$trace['file']==='unknown' || strpos(realpath($trace['file']),$systemPath.DIRECTORY_SEPARATOR)===0;
    }
    return 
false;
}

Возвращает значение, указывающее, является ли стек вызовов из кода приложения.

render() метод

protected void render(string $view, array $data)
$view string имя представления (имя файла без расширения). См. getViewFile, чтобы узнать, как находится файл представления по его имени.
$data array данные, передаваемые представлению
Исходный код: framework/base/CErrorHandler.php#335 (показать)
protected function render($view,$data)
{
    
$data['version']=$this->getVersionInfo();
    
$data['time']=time();
    
$data['admin']=$this->adminInfo;
    include(
$this->getViewFile($view,$data['code']));
}

Отображает представление.

renderError() метод

protected void renderError()
Исходный код: framework/base/CErrorHandler.php#365 (показать)
protected function renderError()
{
    if(
$this->errorAction!==null)
        
Yii::app()->runController($this->errorAction);
    else
    {
        
$data=$this->getError();
        if(
$this->isAjaxRequest())
            
Yii::app()->displayError($data['code'],$data['message'],$data['file'],$data['line']);
        elseif(
YII_DEBUG)
            
$this->render('exception',$data);
        else
            
$this->render('error',$data);
    }
}

Отображает текущую информацию об ошибке. Этот метод отобразит информацию из текущего значения ошибки.

renderException() метод

protected void renderException()
Исходный код: framework/base/CErrorHandler.php#347 (показать)
protected function renderException()
{
    
$exception=$this->getException();
    if(
$exception instanceof CHttpException || !YII_DEBUG)
        
$this->renderError();
    else
    {
        if(
$this->isAjaxRequest())
            
Yii::app()->displayException($exception);
        else
            
$this->render('exception',$this->getError());
    }
}

Отображает информацию об исключении. Этот метод отобразит информацию из текущего значения ошибки.

renderSourceCode() метод

protected string renderSourceCode(string $file, integer $errorLine, integer $maxLines)
$file string путь к файлу исходного кода
$errorLine integer номер строки ошибки
$maxLines integer максимальное количество строк для отображения
{return} string результат отображения
Исходный код: framework/base/CErrorHandler.php#524 (показать)
protected function renderSourceCode($file,$errorLine,$maxLines)
{
    
$errorLine--;    // adjust line number to 0-based from 1-based
    
if($errorLine<0 || ($lines=@file($file))===false || ($lineCount=count($lines))<=$errorLine)
        return 
'';

    
$halfLines=(int)($maxLines/2);
    
$beginLine=$errorLine-$halfLines>0 ? $errorLine-$halfLines:0;
    
$endLine=$errorLine+$halfLines<$lineCount?$errorLine+$halfLines:$lineCount-1;
    
$lineNumberWidth=strlen($endLine+1);

    
$output='';
    for(
$i=$beginLine;$i<=$endLine;++$i)
    {
        
$isErrorLine = $i===$errorLine;
        
$code=sprintf("<span class=\"ln".($isErrorLine?' error-ln':'')."\">%0{$lineNumberWidth}d</span> %s",$i+1,CHtml::encode(str_replace("\t",'    ',$lines[$i])));
        if(!
$isErrorLine)
            
$output.=$code;
        else
            
$output.='<span class="error">'.$code.'</span>';
    }
    return 
'<div class="code"><pre>'.$output.'</pre></div>';
}

Отображает исходный код вокруг строки ошибки.

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CErrorHandler

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API