CErrorHandler
鍖 | system.base |
---|---|
缁ф壙 | class CErrorHandler » CApplicationComponent » CComponent |
瀹炵幇 | IApplicationComponent |
婧愯嚜 | 1.0 |
鐗堟湰 | $Id: CErrorHandler.php 3540 2012-01-16 10:17:01Z mdomba $ |
婧愮爜 | framework/base/CErrorHandler.php |
CErrorHandler鏄敤鏉ュ鐞嗘湭鎹曡幏鐨凱HP閿欒鍜屽紓甯搞
瀹冩牴鎹簲鐢ㄧ▼搴忕殑杩愯妯″紡锛 鏄剧ず鐩稿簲鐨勯敊璇 瀹冮夋嫨浼樺厛鐨勮瑷鏄剧ず閿欒銆
CErrorHandler浣跨敤涓ょ瑙嗗浘锛
寮鍙戣鍥炬槸褰撳簲鐢ㄧ▼搴忎负璋冭瘯妯″紡鏃舵樉绀虹殑瑙嗗浘 锛堝嵆YII_DEBUG瀹氫箟涓簍rue锛夈 杩欑瑙嗗浘鏄剧ず浜嗚缁嗙殑閿欒淇℃伅鍜屾簮浠g爜銆 鐢熶骇瑙嗗浘鏄綋搴旂敤绋嬪簭涓轰骇鍝佹ā寮忔椂鏄剧ず缁欐渶缁堢敤鎴风殑瑙嗗浘銆 鍑轰簬瀹夊叏鍘熷洜锛屽畠浠彧鏄剧ず浜嗛敊璇俊鎭紝 娌℃湁鍏跺畠鏈哄瘑淇℃伅銆
CErrorHandler鎸変互涓嬮『搴忔煡鎵捐鍥炬ā鏉匡細
maxSourceLines灞炴у彲浠ユ寚瀹氬湪寮鍙戣鍥句腑 鏄剧ず鐨勬渶澶ф簮浠g爜琛屾暟銆
CErrorHandler 鏄竴涓牳蹇冨簲鐢ㄧ粍浠讹紝瀹冭兘闅忔椂閫氳繃 CApplication::getErrorHandler()璁块棶銆
瀹冩牴鎹簲鐢ㄧ▼搴忕殑杩愯妯″紡锛 鏄剧ず鐩稿簲鐨勯敊璇 瀹冮夋嫨浼樺厛鐨勮瑷鏄剧ず閿欒銆
CErrorHandler浣跨敤涓ょ瑙嗗浘锛
- 寮鍙戣鍥撅紝鍚嶄负
exception.php
; - 鐢熶骇瑙嗗浘锛屽悕涓
error<StatusCode>.php
;
寮鍙戣鍥炬槸褰撳簲鐢ㄧ▼搴忎负璋冭瘯妯″紡鏃舵樉绀虹殑瑙嗗浘 锛堝嵆YII_DEBUG瀹氫箟涓簍rue锛夈 杩欑瑙嗗浘鏄剧ず浜嗚缁嗙殑閿欒淇℃伅鍜屾簮浠g爜銆 鐢熶骇瑙嗗浘鏄綋搴旂敤绋嬪簭涓轰骇鍝佹ā寮忔椂鏄剧ず缁欐渶缁堢敤鎴风殑瑙嗗浘銆 鍑轰簬瀹夊叏鍘熷洜锛屽畠浠彧鏄剧ず浜嗛敊璇俊鎭紝 娌℃湁鍏跺畠鏈哄瘑淇℃伅銆
CErrorHandler鎸変互涓嬮『搴忔煡鎵捐鍥炬ā鏉匡細
themes/ThemeName/views/system
: when a theme is active.protected/views/system
framework/views
maxSourceLines灞炴у彲浠ユ寚瀹氬湪寮鍙戣鍥句腑 鏄剧ず鐨勬渶澶ф簮浠g爜琛屾暟銆
CErrorHandler 鏄竴涓牳蹇冨簲鐢ㄧ粍浠讹紝瀹冭兘闅忔椂閫氳繃 CApplication::getErrorHandler()璁块棶銆
鍏叡灞炴
灞炴 | 绫诲瀷 | 鎻忚堪 | 瀹氫箟鍦 |
---|---|---|---|
adminInfo | string | 搴旂敤绋嬪簭绠$悊鍛樹俊鎭紙鍙互鏄竴涓悕瀛楁垨鐢靛瓙閭欢閾炬帴锛夈傚畠浼氭樉绀哄湪鏈缁堢敤鎴风殑閿欒闈㈤〉锛岄粯璁や负鈥榯he webmaster鈥欍 | CErrorHandler |
behaviors | array | 杩欎釜搴旂敤缁勪欢闄勫姞鐨勮涓恒 杩欐琛屼负灏嗗湪搴旂敤缁勪欢璋冪敤init鏃堕檮鍔犲湪搴旂敤缁勪欢涓娿 璇峰弬鐓CModel::behaviors濡備綍鎸囧畾姝ゅ睘鎬у笺 | CApplicationComponent |
discardOutput | boolean | 鏄惁鎶涘純閿欒鏄剧ず涔嬪墠鐨勮緭鍑哄唴瀹癸紝榛樿涓簍rue銆 | CErrorHandler |
error | array | 杩斿洖褰撳墠姝e湪澶勭悊鐨勯敊璇殑璇︾粏淇℃伅銆 | CErrorHandler |
errorAction | string | 琚敤鏉ユ樉绀哄閮ㄩ敊璇俊鎭殑鎺у埗鍏跺姩浣滅殑璺敱锛堜緥濡傗榮ite/error鈥欙級銆 鍦ㄥ姩浣滀腑锛屽畠閫氳繃Yii::app()->errorHandler->error寰楀埌鐩稿叧鐨勯敊璇俊鎭 杩欎釜灞炴ч粯璁や负null锛屾剰鍛崇潃CErrorHandler灏嗗鐞嗛敊璇樉绀恒 | CErrorHandler |
isInitialized | boolean | 妫鏌ュ簲鐢ㄧ粍浠舵槸鍚﹀凡缁忓垵濮嬪寲銆 | CApplicationComponent |
maxSourceLines | integer | 鏄剧ず鏈澶ф簮浠g爜琛屾暟锛岄粯璁25銆 | CErrorHandler |
maxTraceSourceLines | integer | 鏄剧ず鏈澶ц窡韪簮浠g爜琛屾暟锛岄粯璁10銆 | CErrorHandler |
鍏叡鏂规硶
鍙椾繚鎶ゆ柟娉
鏂规硶 | 鎻忚堪 | 瀹氫箟鍦 |
---|---|---|
argumentsToString() | 杞崲鍙傛暟鏁扮粍涓哄瓧绗︿覆琛ㄧ幇銆 | CErrorHandler |
getExactTrace() | 杩斿洖闂鍙戠敓鐨勮缁嗚窡韪俊鎭 | CErrorHandler |
getVersionInfo() | 杩斿洖鏈嶅姟鐗堟湰淇℃伅銆 | CErrorHandler |
getViewFile() | 纭畾搴旇浣跨敤鐨勮鍥炬枃浠躲 | CErrorHandler |
getViewFileInternal() | 鏌ョ湅鎸囧畾鐩綍涓嬬殑瑙嗗浘銆 | CErrorHandler |
handleError() | 澶勭悊PHP閿欒銆 | CErrorHandler |
handleException() | 澶勭悊寮傚父銆 | CErrorHandler |
isAjaxRequest() | 褰撳墠璇锋眰鏄惁鏄竴涓狝JAX锛圶MLHttpRequest锛夎姹傘 | CErrorHandler |
isCoreCode() | 杩斿洖鏄惁浠庡簲鐢ㄧ▼搴忎唬鐮佷腑璋冪敤鍫嗘爤銆 | CErrorHandler |
render() | 娓叉煋瑙嗗浘 | CErrorHandler |
renderSourceCode() | 娓叉煋鍥寸粫閿欒琛屾簮浠g爜銆 | CErrorHandler |
灞炴ц缁
adminInfo
灞炴
public string $adminInfo;
搴旂敤绋嬪簭绠$悊鍛樹俊鎭紙鍙互鏄竴涓悕瀛楁垨鐢靛瓙閭欢閾炬帴锛夈傚畠浼氭樉绀哄湪鏈缁堢敤鎴风殑閿欒闈㈤〉锛岄粯璁や负鈥榯he webmaster鈥欍
discardOutput
灞炴
public boolean $discardOutput;
鏄惁鎶涘純閿欒鏄剧ず涔嬪墠鐨勮緭鍑哄唴瀹癸紝榛樿涓簍rue銆
error
灞炴
鍙
public array getError()
杩斿洖褰撳墠姝e湪澶勭悊鐨勯敊璇殑璇︾粏淇℃伅銆 璇ラ敊璇繑鍥炵殑鏁扮粍鍖呭惈濡備笅淇℃伅锛
- code - HTTP鐘舵佺爜锛堜緥濡403鈥500锛
- type - 閿欒绫诲瀷锛堜緥濡傗楥HttpException鈥欙紝鈥楶HP Error鈥欙級
- message - 閿欒淇℃伅
- file - 鍙戠敓閿欒鐨凱HP鑴氭湰鏂囦欢鍚
- line - 鍙戠敓閿欒鐨勪唬鐮佽鍙
- trace - 閿欒鐨勮皟鐢ㄥ爢鏍
- source - 鍙戠敓閿欒鐨勪笂涓嬫枃婧愮爜
errorAction
灞炴
public string $errorAction;
琚敤鏉ユ樉绀哄閮ㄩ敊璇俊鎭殑鎺у埗鍏跺姩浣滅殑璺敱锛堜緥濡傗榮ite/error鈥欙級銆 鍦ㄥ姩浣滀腑锛屽畠閫氳繃Yii::app()->errorHandler->error寰楀埌鐩稿叧鐨勯敊璇俊鎭 杩欎釜灞炴ч粯璁や负null锛屾剰鍛崇潃CErrorHandler灏嗗鐞嗛敊璇樉绀恒
maxSourceLines
灞炴
public integer $maxSourceLines;
鏄剧ず鏈澶ф簮浠g爜琛屾暟锛岄粯璁25銆
maxTraceSourceLines
灞炴
锛堝彲鐢ㄨ嚜 v1.1.6锛
public integer $maxTraceSourceLines;
鏄剧ず鏈澶ц窡韪簮浠g爜琛屾暟锛岄粯璁10銆
versionInfo
灞炴
鍙
protected string getVersionInfo()
杩斿洖鏈嶅姟鐗堟湰淇℃伅銆 濡傛灉搴旂敤鏄敓浜фā寮忥紝灏嗚繑鍥炵┖瀛楃涓层
鏂规硶璇︾粏
argumentsToString()
鏂规硶
protected string argumentsToString(array $args)
| ||
$args | array | 瑕佽浆鎹㈢殑鍙傛暟鏁扮粍 |
{return} | string | 鍙傛暟鏁扮粍鐨勫瓧绗︿覆琛ㄧ幇 |
婧愮爜锛 framework/base/CErrorHandler.php#392 (鏄剧ず)
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);
else if(is_bool($value))
$args[$key] = $value ? 'true' : 'false';
else if(is_string($value))
{
if(strlen($value)>64)
$args[$key] = '"'.substr($value,0,64).'..."';
else
$args[$key] = '"'.$value.'"';
}
else if(is_array($value))
$args[$key] = 'array('.$this->argumentsToString($value).')';
else if($value===null)
$args[$key] = 'null';
else if(is_resource($value))
$args[$key] = 'resource';
if(is_string($key))
{
$args[$key] = '"'.$key.'" => '.$args[$key];
}
else if($isAssoc)
{
$args[$key] = $key.' => '.$args[$key];
}
}
$out = implode(", ", $args);
return $out;
}
杞崲鍙傛暟鏁扮粍涓哄瓧绗︿覆琛ㄧ幇銆
getError()
鏂规硶
public array getError()
| ||
{return} | array | 閿欒璇︾粏淇℃伅锛屽鏋滄病鏈夐敊璇繑鍥瀗ull銆 |
杩斿洖褰撳墠姝e湪澶勭悊鐨勯敊璇殑璇︾粏淇℃伅銆 璇ラ敊璇繑鍥炵殑鏁扮粍鍖呭惈濡備笅淇℃伅锛
- code - HTTP鐘舵佺爜锛堜緥濡403鈥500锛
- type - 閿欒绫诲瀷锛堜緥濡傗楥HttpException鈥欙紝鈥楶HP Error鈥欙級
- message - 閿欒淇℃伅
- file - 鍙戠敓閿欒鐨凱HP鑴氭湰鏂囦欢鍚
- line - 鍙戠敓閿欒鐨勪唬鐮佽鍙
- trace - 閿欒鐨勮皟鐢ㄥ爢鏍
- source - 鍙戠敓閿欒鐨勪笂涓嬫枃婧愮爜
getExactTrace()
鏂规硶
protected array getExactTrace(Exception $exception)
| ||
$exception | Exception | 鏈崟鑾峰埌鐨勫紓甯 |
{return} | array | 闂鍑虹幇鐨勮缁嗚窡韪俊鎭 |
婧愮爜锛 framework/base/CErrorHandler.php#288 (鏄剧ず)
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;
}
杩斿洖闂鍙戠敓鐨勮缁嗚窡韪俊鎭
getVersionInfo()
鏂规硶
protected string getVersionInfo()
| ||
{return} | string | 鏈嶅姟鐗堟湰淇℃伅銆傜敓浜фā寮忓皢杩斿洖绌哄瓧绗︿覆銆 |
婧愮爜锛 framework/base/CErrorHandler.php#373 (鏄剧ず)
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 | 瑙嗗浘鍚嶏紙鏃犺鏄榚xception鈥欒繕鏄榚rror鈥欙級 |
$code | integer | HTTP鐘舵佺爜 |
{return} | string | 瑙嗗浘鏂囦欢璺緞 |
婧愮爜锛 framework/base/CErrorHandler.php#327 (鏄剧ず)
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 | 瑙嗗浘鍚嶏紙鏃犺鏄榚xception鈥欒繕鏄榚rror鈥欙級 |
$code | integer | HTTP鐘舵佺爜 |
$srcLanguage | string | 瑙嗗浘鏂囦欢鐨勮瑷 |
{return} | string | 瑙嗗浘鏂囦欢鐨勮矾寰 |
婧愮爜锛 framework/base/CErrorHandler.php#354 (鏄剧ず)
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#93 (鏄剧ず)
public function handle($event)
{
// set event as handled to prevent it from being handled by other event handlers
$event->handled=true;
if($this->discardOutput)
{
// the following manual level counting is to deal with zlib.output_compression set to On
for($level=ob_get_level();$level>0;--$level)
{
@ob_end_clean();
}
}
if($event instanceof CExceptionEvent)
$this->handleException($event->exception);
else // CErrorEvent
$this->handleError($event);
}
澶勭悊寮傚父/閿欒浜嬩欢銆 褰撴崟鑾峰埌寮傚父鎴朠HP閿欒鏃 璋冪敤姝ゆ柟娉曘
handleError()
鏂规硶
protected void handleError(CErrorEvent $event)
| ||
$event | CErrorEvent | PHP閿欒浜嬩欢 |
婧愮爜锛 framework/base/CErrorHandler.php#200 (鏄剧ず)
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->_error=$data=array(
'code'=>500,
'type'=>$type,
'message'=>$event->message,
'file'=>$event->file,
'line'=>$event->line,
'trace'=>$traceString,
'traces'=>$trace,
);
if(!headers_sent())
header("HTTP/1.0 500 PHP Error");
if($this->isAjaxRequest())
$app->displayError($event->code,$event->message,$event->file,$event->line);
else if(YII_DEBUG)
$this->render('exception',$data);
else
$this->render('error',$data);
}
else
$app->displayError($event->code,$event->message,$event->file,$event->line);
}
澶勭悊PHP閿欒銆
handleException()
鏂规硶
protected void handleException(Exception $exception)
| ||
$exception | Exception | 鎹曡幏鐨勫紓甯 |
婧愮爜锛 framework/base/CErrorHandler.php#136 (鏄剧ず)
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->_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())
header("HTTP/1.0 {$data['code']} ".get_class($exception));
if($exception instanceof CHttpException || !YII_DEBUG)
$this->render('error',$data);
else
{
if($this->isAjaxRequest())
$app->displayException($exception);
else
$this->render('exception',$data);
}
}
else
$app->displayException($exception);
}
澶勭悊寮傚父銆
isAjaxRequest()
鏂规硶
protected boolean isAjaxRequest()
| ||
{return} | boolean | 褰撳墠璇锋眰鏄惁鏄疉JAX璇锋眰銆 |
婧愮爜锛 framework/base/CErrorHandler.php#278 (鏄剧ず)
protected function isAjaxRequest()
{
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest';
}
褰撳墠璇锋眰鏄惁鏄竴涓狝JAX锛圶MLHttpRequest锛夎姹傘
isCoreCode()
鏂规硶
protected boolean isCoreCode(array $trace)
| ||
$trace | array | 璺熻釜鏁版嵁 |
{return} | boolean | 鏄惁浠庡簲鐢ㄧ▼搴忎唬鐮佷腑璋冪敤鍫嗘爤銆 |
婧愮爜锛 framework/base/CErrorHandler.php#447 (鏄剧ず)
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#307 (鏄剧ず)
protected function render($view,$data)
{
if($view==='error' && $this->errorAction!==null)
Yii::app()->runController($this->errorAction);
else
{
// additional information to be passed to view
$data['version']=$this->getVersionInfo();
$data['time']=time();
$data['admin']=$this->adminInfo;
include($this->getViewFile($view,$data['code']));
}
}
娓叉煋瑙嗗浘
renderSourceCode()
鏂规硶
protected string renderSourceCode(string $file, integer $errorLine, integer $maxLines)
| ||
$file | string | 婧愭枃浠惰矾寰 |
$errorLine | integer | 閿欒琛屽彿 |
$maxLines | integer | 鏄剧ず鏈澶ц鏁 |
{return} | string | 娓叉煋缁撴灉 |
婧愮爜锛 framework/base/CErrorHandler.php#464 (鏄剧ず)
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>';
}
娓叉煋鍥寸粫閿欒琛屾簮浠g爜銆