CErrorHandler
| Пакет | system.base |
|---|---|
| Наследование | class CErrorHandler » CApplicationComponent » CComponent |
| Реализует | IApplicationComponent |
| С версии | 1.0 |
| Исходный код | framework/base/CErrorHandler.php |
Он отображает эти ошибки с помощью соответствующих представлений, основанных на характере ошибки и режиме работы приложения. Также он выбирает наиболее предпочтительный язык для отображения ошибки.
CErrorHandler использует два набора представлений:
- представления для разработки, имеющие имена
exception.php; - представления для производства, имеющие имена
error<StatusCode>.php;
Представления для разработки отображаются, когда приложение находится в режиме отладки (т.е. YII_DEBUG определён как true). В этих представлениях отображается подробная информация об ошибке с исходным кодом. Представления для производства предназначены для отображения конечным пользователям и используются, когда приложение находится в режиме производства. По соображениям безопасности они отображают только сообщение об ошибке без какой-либо конфиденциальной информации.
CErrorHandler ищет шаблоны представлений в следующих расположениях в указанном порядке:
-
themes/ThemeName/views/system: когда активна тема. protected/views/systemframework/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 | строковое представление массива аргументов |
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, если ошибка отсутствует. |
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 | точная трассировка, где возникла проблема |
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, если исключение отсутствует. |
public function getException()
{
return $this->_exception;
}
Возвращает экземпляр исключения, которое в настоящее время обрабатывается.
getHttpHeader() метод
protected string getHttpHeader(integer $httpCode, string $replacement='') | ||
| $httpCode | integer | код ошибки для отображения |
| $replacement | string | замена для строки ошибки, если код не известен |
| {return} | string | текстовое представление заданного кода ошибки или строка замены, если код ошибки неизвестен |
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 | информация о версии сервера. Пустая строка, если приложение в режиме производства. |
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 | путь к файлу представления |
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 | путь к файлу представления |
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 | событие, содержащее информацию об исключении/ошибке |
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 |
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 | пойманное исключение |
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-запросом. |
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 | является ли стек вызовов из кода приложения. |
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 | данные, передаваемые представлению |
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() |
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() |
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 | результат отображения |
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