|  |  |  | @ -1,23 +1,22 @@ | 
			
		
	
		
			
				
					|  |  |  |  | <?php | 
			
		
	
		
			
				
					|  |  |  |  | /** | 
			
		
	
		
			
				
					|  |  |  |  |  * This file contains the error handler application component. | 
			
		
	
		
			
				
					|  |  |  |  |  * ErrorHandler class file. | 
			
		
	
		
			
				
					|  |  |  |  |  * | 
			
		
	
		
			
				
					|  |  |  |  |  * @author Qiang Xue <qiang.xue@gmail.com> | 
			
		
	
		
			
				
					|  |  |  |  |  * @link http://www.yiiframework.com/ | 
			
		
	
		
			
				
					|  |  |  |  |  * @copyright Copyright © 2008-2011 Yii Software LLC | 
			
		
	
		
			
				
					|  |  |  |  |  * @copyright Copyright © 2008-2012 Yii Software LLC | 
			
		
	
		
			
				
					|  |  |  |  |  * @license http://www.yiiframework.com/license/ | 
			
		
	
		
			
				
					|  |  |  |  |  */ | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | Yii::import('CHtml',true); | 
			
		
	
		
			
				
					|  |  |  |  | namespace yii\base; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /** | 
			
		
	
		
			
				
					|  |  |  |  |  * CErrorHandler handles uncaught PHP errors and exceptions. | 
			
		
	
		
			
				
					|  |  |  |  |  * ErrorHandler handles uncaught PHP errors and exceptions. | 
			
		
	
		
			
				
					|  |  |  |  |  * | 
			
		
	
		
			
				
					|  |  |  |  |  * It displays these errors using appropriate views based on the | 
			
		
	
		
			
				
					|  |  |  |  |  * nature of the error and the mode the application runs at. | 
			
		
	
		
			
				
					|  |  |  |  |  * It also chooses the most preferred language for displaying the error. | 
			
		
	
		
			
				
					|  |  |  |  |  * | 
			
		
	
		
			
				
					|  |  |  |  |  * CErrorHandler uses two sets of views: | 
			
		
	
		
			
				
					|  |  |  |  |  * ErrorHandler uses two sets of views: | 
			
		
	
		
			
				
					|  |  |  |  |  * <ul> | 
			
		
	
		
			
				
					|  |  |  |  |  * <li>development views, named as <code>exception.php</code>; | 
			
		
	
		
			
				
					|  |  |  |  |  * <li>production views, named as <code>error<StatusCode>.php</code>; | 
			
		
	
	
		
			
				
					|  |  |  | @ -33,7 +32,7 @@ Yii::import('CHtml',true); | 
			
		
	
		
			
				
					|  |  |  |  |  * For security reasons, they only display the error message without any | 
			
		
	
		
			
				
					|  |  |  |  |  * sensitive information. | 
			
		
	
		
			
				
					|  |  |  |  |  * | 
			
		
	
		
			
				
					|  |  |  |  |  * CErrorHandler looks for the view templates from the following locations in order: | 
			
		
	
		
			
				
					|  |  |  |  |  * ErrorHandler looks for the view templates from the following locations in order: | 
			
		
	
		
			
				
					|  |  |  |  |  * <ol> | 
			
		
	
		
			
				
					|  |  |  |  |  * <li><code>themes/ThemeName/views/system</code>: when a theme is active.</li> | 
			
		
	
		
			
				
					|  |  |  |  |  * <li><code>protected/views/system</code></li> | 
			
		
	
	
		
			
				
					|  |  |  | @ -44,17 +43,15 @@ Yii::import('CHtml',true); | 
			
		
	
		
			
				
					|  |  |  |  |  * The property {@link maxSourceLines} can be changed to specify the number | 
			
		
	
		
			
				
					|  |  |  |  |  * of source code lines to be displayed in development views. | 
			
		
	
		
			
				
					|  |  |  |  |  * | 
			
		
	
		
			
				
					|  |  |  |  |  * CErrorHandler is a core application component that can be accessed via | 
			
		
	
		
			
				
					|  |  |  |  |  * ErrorHandler is a core application component that can be accessed via | 
			
		
	
		
			
				
					|  |  |  |  |  * {@link CApplication::getErrorHandler()}. | 
			
		
	
		
			
				
					|  |  |  |  |  * | 
			
		
	
		
			
				
					|  |  |  |  |  * @property array $error The error details. Null if there is no error. | 
			
		
	
		
			
				
					|  |  |  |  |  * | 
			
		
	
		
			
				
					|  |  |  |  |  * @author Qiang Xue <qiang.xue@gmail.com> | 
			
		
	
		
			
				
					|  |  |  |  |  * @version $Id$ | 
			
		
	
		
			
				
					|  |  |  |  |  * @package system.base | 
			
		
	
		
			
				
					|  |  |  |  |  * @since 1.0 | 
			
		
	
		
			
				
					|  |  |  |  |  * @since 2.0 | 
			
		
	
		
			
				
					|  |  |  |  |  */ | 
			
		
	
		
			
				
					|  |  |  |  | class CErrorHandler extends CApplicationComponent | 
			
		
	
		
			
				
					|  |  |  |  | class ErrorHandler extends ApplicationComponent | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @var integer maximum number of source code lines to be displayed. Defaults to 25. | 
			
		
	
	
		
			
				
					|  |  |  | @ -63,7 +60,6 @@ class CErrorHandler extends CApplicationComponent | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @var integer maximum number of trace source code lines to be displayed. Defaults to 10. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @since 1.1.6 | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	public $maxTraceSourceLines = 10; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -74,99 +70,106 @@ class CErrorHandler extends CApplicationComponent | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @var boolean whether to discard any existing page output before error display. Defaults to true. | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	public $discardOutput=true; | 
			
		
	
		
			
				
					|  |  |  |  | 	public $discardExistingOutput = true; | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @var string the route (eg 'site/error') to the controller action that will be used to display external errors. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * Inside the action, it can retrieve the error information by Yii::app()->errorHandler->error. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * This property defaults to null, meaning CErrorHandler will handle the error display. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * This property defaults to null, meaning ErrorHandler will handle the error display. | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	public $errorAction; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	private $_error; | 
			
		
	
		
			
				
					|  |  |  |  | 	public $exception; | 
			
		
	
		
			
				
					|  |  |  |  | 	public $compactOutput; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
		
			
				
					|  |  |  |  | 	 * Handles the exception/error event. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * This method is invoked by the application whenever it captures | 
			
		
	
		
			
				
					|  |  |  |  | 	 * an exception or PHP error. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @param CEvent $event the event containing the exception/error information | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	public function handle($event) | 
			
		
	
		
			
				
					|  |  |  |  | 	public function init() | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		// set event as handled to prevent it from being handled by other event handlers | 
			
		
	
		
			
				
					|  |  |  |  | 		$event->handled=true; | 
			
		
	
		
			
				
					|  |  |  |  | 		set_exception_handler(array($this, 'handleException')); | 
			
		
	
		
			
				
					|  |  |  |  | 		set_error_handler(array($this, 'handleError'), error_reporting()); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if($this->discardOutput) | 
			
		
	
		
			
				
					|  |  |  |  | 	protected function logException($exception) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 			// the following manual level counting is to deal with zlib.output_compression set to On | 
			
		
	
		
			
				
					|  |  |  |  | 			for($level=ob_get_level();$level>0;--$level) | 
			
		
	
		
			
				
					|  |  |  |  | 		$category = get_class($exception); | 
			
		
	
		
			
				
					|  |  |  |  | 		if ($exception instanceof HttpException) { | 
			
		
	
		
			
				
					|  |  |  |  | 			$category .= '\\' . $exception->statusCode; | 
			
		
	
		
			
				
					|  |  |  |  | 		} elseif ($exception instanceof \ErrorException) { | 
			
		
	
		
			
				
					|  |  |  |  | 			$category .= '\\' . $exception->getSeverity(); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		\Yii::error((string)$exception, $category); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	protected function clearOutput() | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		// 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); | 
			
		
	
		
			
				
					|  |  |  |  | 	protected function simple() | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		if (YII_DEBUG) { | 
			
		
	
		
			
				
					|  |  |  |  | 			echo '<h1>' . get_class($exception) . "</h1>\n"; | 
			
		
	
		
			
				
					|  |  |  |  | 			echo '<p>' . $exception->getMessage() . ' (' . $exception->getFile() . ':' . $exception->getLine() . ')</p>'; | 
			
		
	
		
			
				
					|  |  |  |  | 			echo '<pre>' . $exception->getTraceAsString() . '</pre>'; | 
			
		
	
		
			
				
					|  |  |  |  | 		} else | 
			
		
	
		
			
				
					|  |  |  |  | 		{ | 
			
		
	
		
			
				
					|  |  |  |  | 			echo '<h1>' . get_class($exception) . "</h1>\n"; | 
			
		
	
		
			
				
					|  |  |  |  | 			echo '<p>' . $exception->getMessage() . '</p>'; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
		
			
				
					|  |  |  |  | 	 * Returns the details about the error that is currently being handled. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * The error is returned in terms of an array, with the following information: | 
			
		
	
		
			
				
					|  |  |  |  | 	 * <ul> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * <li>code - the HTTP status code (e.g. 403, 500)</li> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * <li>type - the error type (e.g. 'CHttpException', 'PHP Error')</li> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * <li>message - the error message</li> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * <li>file - the name of the PHP script file where the error occurs</li> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * <li>line - the line number of the code where the error occurs</li> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * <li>trace - the call stack of the error</li> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * <li>source - the context source code where the error occurs</li> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * </ul> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @return array the error details. Null if there is no error. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @param \Exception $exception | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	public function getError() | 
			
		
	
		
			
				
					|  |  |  |  | 	public function handleException($exception) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		return $this->_error; | 
			
		
	
		
			
				
					|  |  |  |  | 		$this->exception = $exception; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		// disable error capturing to avoid recursive errors | 
			
		
	
		
			
				
					|  |  |  |  | 		restore_error_handler(); | 
			
		
	
		
			
				
					|  |  |  |  | 		restore_exception_handler(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		$this->logException($exception); | 
			
		
	
		
			
				
					|  |  |  |  | 		if ($this->discardExistingOutput) { | 
			
		
	
		
			
				
					|  |  |  |  | 			$this->clearOutput(); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
		
			
				
					|  |  |  |  | 	 * Handles the exception. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @param Exception $exception the exception captured | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	protected function handleException($exception) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		$app=Yii::app(); | 
			
		
	
		
			
				
					|  |  |  |  | 		if($app instanceof CWebApplication) | 
			
		
	
		
			
				
					|  |  |  |  | 		{ | 
			
		
	
		
			
				
					|  |  |  |  | 			if(($trace=$this->getExactTrace($exception))===null) | 
			
		
	
		
			
				
					|  |  |  |  | 			{ | 
			
		
	
		
			
				
					|  |  |  |  | 		if ($this->compactOutput === null) { | 
			
		
	
		
			
				
					|  |  |  |  | 			// not in Web application, or not in AJAX request | 
			
		
	
		
			
				
					|  |  |  |  | 			$this->compactOutput = !(\Yii::$application instanceof \yii\web\Application) || isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest'; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if ($this->compactOutput) { | 
			
		
	
		
			
				
					|  |  |  |  | 			$this->simple(); | 
			
		
	
		
			
				
					|  |  |  |  | 			return; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (($trace = $this->getExactTrace($exception)) === null) { | 
			
		
	
		
			
				
					|  |  |  |  | 			$fileName = $exception->getFile(); | 
			
		
	
		
			
				
					|  |  |  |  | 			$errorLine = $exception->getLine(); | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			else | 
			
		
	
		
			
				
					|  |  |  |  | 			{ | 
			
		
	
		
			
				
					|  |  |  |  | 		} else { | 
			
		
	
		
			
				
					|  |  |  |  | 			$fileName = $trace['file']; | 
			
		
	
		
			
				
					|  |  |  |  | 			$errorLine = $trace['line']; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		$trace = $exception->getTrace(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			foreach($trace as $i=>$t) | 
			
		
	
		
			
				
					|  |  |  |  | 			{ | 
			
		
	
		
			
				
					|  |  |  |  | 				if(!isset($t['file'])) | 
			
		
	
		
			
				
					|  |  |  |  | 		foreach ($trace as $i => $t) { | 
			
		
	
		
			
				
					|  |  |  |  | 			if (!isset($t['file'])) { | 
			
		
	
		
			
				
					|  |  |  |  | 				$trace[$i]['file'] = 'unknown'; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 				if(!isset($t['line'])) | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			if (!isset($t['line'])) { | 
			
		
	
		
			
				
					|  |  |  |  | 				$trace[$i]['line'] = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 				if(!isset($t['function'])) | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			if (!isset($t['function'])) { | 
			
		
	
		
			
				
					|  |  |  |  | 				$trace[$i]['function'] = 'unknown'; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			unset($trace[$i]['object']); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		$this->_error = $data = array( | 
			
		
	
		
			
				
					|  |  |  |  | 				'code'=>($exception instanceof CHttpException)?$exception->statusCode:500, | 
			
		
	
		
			
				
					|  |  |  |  | 			'code' => $exception instanceof HttpException ? $exception->statusCode : 500, | 
			
		
	
		
			
				
					|  |  |  |  | 			'type' => get_class($exception), | 
			
		
	
		
			
				
					|  |  |  |  | 			'errorCode' => $exception->getCode(), | 
			
		
	
		
			
				
					|  |  |  |  | 			'message' => $exception->getMessage(), | 
			
		
	
	
		
			
				
					|  |  |  | @ -176,21 +179,34 @@ class CErrorHandler extends CApplicationComponent | 
			
		
	
		
			
				
					|  |  |  |  | 			'traces' => $trace, | 
			
		
	
		
			
				
					|  |  |  |  | 		); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			if(!headers_sent()) | 
			
		
	
		
			
				
					|  |  |  |  | 		if (!headers_sent()) { | 
			
		
	
		
			
				
					|  |  |  |  | 			header("HTTP/1.0 {$data['code']} " . get_class($exception)); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			if($exception instanceof CHttpException || !YII_DEBUG) | 
			
		
	
		
			
				
					|  |  |  |  | 		if ($exception instanceof HttpException || !YII_DEBUG) { | 
			
		
	
		
			
				
					|  |  |  |  | 			$this->render('error', $data); | 
			
		
	
		
			
				
					|  |  |  |  | 			else | 
			
		
	
		
			
				
					|  |  |  |  | 			{ | 
			
		
	
		
			
				
					|  |  |  |  | 				if($this->isAjaxRequest()) | 
			
		
	
		
			
				
					|  |  |  |  | 					$app->displayException($exception); | 
			
		
	
		
			
				
					|  |  |  |  | 				else | 
			
		
	
		
			
				
					|  |  |  |  | 		} else { | 
			
		
	
		
			
				
					|  |  |  |  | 			$this->render('exception', $data); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 		else | 
			
		
	
		
			
				
					|  |  |  |  | 			$app->displayException($exception); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
		
			
				
					|  |  |  |  | 	 * Returns the details about the error that is currently being handled. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * The error is returned in terms of an array, with the following information: | 
			
		
	
		
			
				
					|  |  |  |  | 	 * <ul> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * <li>code - the HTTP status code (e.g. 403, 500)</li> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * <li>type - the error type (e.g. 'CHttpException', 'PHP Error')</li> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * <li>message - the error message</li> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * <li>file - the name of the PHP script file where the error occurs</li> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * <li>line - the line number of the code where the error occurs</li> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * <li>trace - the call stack of the error</li> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * <li>source - the context source code where the error occurs</li> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * </ul> | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @return array the error details. Null if there is no error. | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	public function getError() | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		return $this->_error; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
	
		
			
				
					|  |  |  | @ -224,8 +240,7 @@ class CErrorHandler extends CApplicationComponent | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		$app = Yii::app(); | 
			
		
	
		
			
				
					|  |  |  |  | 		if($app instanceof CWebApplication) | 
			
		
	
		
			
				
					|  |  |  |  | 		{ | 
			
		
	
		
			
				
					|  |  |  |  | 		if ($app instanceof CWebApplication) { | 
			
		
	
		
			
				
					|  |  |  |  | 			switch ($event->code) | 
			
		
	
		
			
				
					|  |  |  |  | 			{ | 
			
		
	
		
			
				
					|  |  |  |  | 				case E_WARNING: | 
			
		
	
	
		
			
				
					|  |  |  | @ -272,29 +287,19 @@ class CErrorHandler extends CApplicationComponent | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
		
			
				
					|  |  |  |  | 	 * whether the current request is an AJAX (XMLHttpRequest) request. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @return boolean whether the current request is an AJAX request. | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	protected function isAjaxRequest() | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest'; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
		
			
				
					|  |  |  |  | 	 * Returns the exact trace where the problem occurs. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @param Exception $exception the uncaught exception | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @param \Exception $exception the uncaught exception | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @return array the exact trace where the problem occurs | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	protected function getExactTrace($exception) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		$traces = $exception->getTrace(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		foreach($traces as $trace) | 
			
		
	
		
			
				
					|  |  |  |  | 		{ | 
			
		
	
		
			
				
					|  |  |  |  | 		foreach ($traces as $trace) { | 
			
		
	
		
			
				
					|  |  |  |  | 			// property access exception | 
			
		
	
		
			
				
					|  |  |  |  | 			if(isset($trace['function']) && ($trace['function']==='__get' || $trace['function']==='__set')) | 
			
		
	
		
			
				
					|  |  |  |  | 			if (isset($trace['function']) && ($trace['function'] === '__get' || $trace['function'] === '__set')) { | 
			
		
	
		
			
				
					|  |  |  |  | 				return $trace; | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		return null; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -334,8 +339,7 @@ class CErrorHandler extends CApplicationComponent | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		foreach ($viewPaths as $i => $viewPath) | 
			
		
	
		
			
				
					|  |  |  |  | 		{ | 
			
		
	
		
			
				
					|  |  |  |  | 			if($viewPath!==null) | 
			
		
	
		
			
				
					|  |  |  |  | 			{ | 
			
		
	
		
			
				
					|  |  |  |  | 			if ($viewPath !== null) { | 
			
		
	
		
			
				
					|  |  |  |  | 				$viewFile = $this->getViewFileInternal($viewPath, $view, $code, $i === 2 ? 'en_us' : null); | 
			
		
	
		
			
				
					|  |  |  |  | 				if (is_file($viewFile)) | 
			
		
	
		
			
				
					|  |  |  |  | 					return $viewFile; | 
			
		
	
	
		
			
				
					|  |  |  | @ -354,8 +358,7 @@ class CErrorHandler extends CApplicationComponent | 
			
		
	
		
			
				
					|  |  |  |  | 	protected function getViewFileInternal($viewPath, $view, $code, $srcLanguage = null) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		$app = Yii::app(); | 
			
		
	
		
			
				
					|  |  |  |  | 		if($view==='error') | 
			
		
	
		
			
				
					|  |  |  |  | 		{ | 
			
		
	
		
			
				
					|  |  |  |  | 		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); | 
			
		
	
	
		
			
				
					|  |  |  | @ -372,14 +375,14 @@ class CErrorHandler extends CApplicationComponent | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	protected function getVersionInfo() | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		if(YII_DEBUG) | 
			
		
	
		
			
				
					|  |  |  |  | 		{ | 
			
		
	
		
			
				
					|  |  |  |  | 			$version='<a href="http://www.yiiframework.com/">Yii Framework</a>/'.Yii::getVersion(); | 
			
		
	
		
			
				
					|  |  |  |  | 			if(isset($_SERVER['SERVER_SOFTWARE'])) | 
			
		
	
		
			
				
					|  |  |  |  | 		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 | 
			
		
	
		
			
				
					|  |  |  |  | 		} else { | 
			
		
	
		
			
				
					|  |  |  |  | 			$version = ''; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		return $version; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -398,8 +401,7 @@ class CErrorHandler extends CApplicationComponent | 
			
		
	
		
			
				
					|  |  |  |  | 		foreach ($args as $key => $value) | 
			
		
	
		
			
				
					|  |  |  |  | 		{ | 
			
		
	
		
			
				
					|  |  |  |  | 			$count++; | 
			
		
	
		
			
				
					|  |  |  |  | 			if($count>=5) | 
			
		
	
		
			
				
					|  |  |  |  | 			{ | 
			
		
	
		
			
				
					|  |  |  |  | 			if ($count >= 5) { | 
			
		
	
		
			
				
					|  |  |  |  | 				if ($count > 5) | 
			
		
	
		
			
				
					|  |  |  |  | 					unset($args[$key]); | 
			
		
	
		
			
				
					|  |  |  |  | 				else | 
			
		
	
	
		
			
				
					|  |  |  | @ -411,8 +413,7 @@ class CErrorHandler extends CApplicationComponent | 
			
		
	
		
			
				
					|  |  |  |  | 				$args[$key] = get_class($value); | 
			
		
	
		
			
				
					|  |  |  |  | 			else if (is_bool($value)) | 
			
		
	
		
			
				
					|  |  |  |  | 				$args[$key] = $value ? 'true' : 'false'; | 
			
		
	
		
			
				
					|  |  |  |  | 			else if(is_string($value)) | 
			
		
	
		
			
				
					|  |  |  |  | 			{ | 
			
		
	
		
			
				
					|  |  |  |  | 			else if (is_string($value)) { | 
			
		
	
		
			
				
					|  |  |  |  | 				if (strlen($value) > 64) | 
			
		
	
		
			
				
					|  |  |  |  | 					$args[$key] = '"' . substr($value, 0, 64) . '..."'; | 
			
		
	
		
			
				
					|  |  |  |  | 				else | 
			
		
	
	
		
			
				
					|  |  |  | @ -425,12 +426,10 @@ class CErrorHandler extends CApplicationComponent | 
			
		
	
		
			
				
					|  |  |  |  | 			else if (is_resource($value)) | 
			
		
	
		
			
				
					|  |  |  |  | 				$args[$key] = 'resource'; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			if(is_string($key)) | 
			
		
	
		
			
				
					|  |  |  |  | 			{ | 
			
		
	
		
			
				
					|  |  |  |  | 			if (is_string($key)) { | 
			
		
	
		
			
				
					|  |  |  |  | 				$args[$key] = '"' . $key . '" => ' . $args[$key]; | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			else if($isAssoc) | 
			
		
	
		
			
				
					|  |  |  |  | 			{ | 
			
		
	
		
			
				
					|  |  |  |  | 			else if ($isAssoc) { | 
			
		
	
		
			
				
					|  |  |  |  | 				$args[$key] = $key . ' => ' . $args[$key]; | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
	
		
			
				
					|  |  |  | @ -446,8 +445,7 @@ class CErrorHandler extends CApplicationComponent | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	protected function isCoreCode($trace) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		if(isset($trace['file'])) | 
			
		
	
		
			
				
					|  |  |  |  | 		{ | 
			
		
	
		
			
				
					|  |  |  |  | 		if (isset($trace['file'])) { | 
			
		
	
		
			
				
					|  |  |  |  | 			$systemPath = realpath(dirname(__FILE__) . '/..'); | 
			
		
	
		
			
				
					|  |  |  |  | 			return $trace['file'] === 'unknown' || strpos(realpath($trace['file']), $systemPath . DIRECTORY_SEPARATOR) === 0; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
	
		
			
				
					|  |  |  | @ -484,4 +482,26 @@ class CErrorHandler extends CApplicationComponent | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		return '<div class="code"><pre>' . $output . '</pre></div>'; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	/** | 
			
		
	
		
			
				
					|  |  |  |  | 	 * Handles PHP execution errors such as warnings, notices. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * | 
			
		
	
		
			
				
					|  |  |  |  | 	 * This method is implemented as a PHP error handler. It requires | 
			
		
	
		
			
				
					|  |  |  |  | 	 * that constant YII_ENABLE_ERROR_HANDLER be defined true. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * | 
			
		
	
		
			
				
					|  |  |  |  | 	 * This method will first raise an `error` event. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * If the error is not handled by any event handler, it will call | 
			
		
	
		
			
				
					|  |  |  |  | 	 * {@link getErrorHandler errorHandler} to process the error. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * | 
			
		
	
		
			
				
					|  |  |  |  | 	 * The application will be terminated by this method. | 
			
		
	
		
			
				
					|  |  |  |  | 	 * | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @param integer $code the level of the error raised | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @param string $message the error message | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @param string $file the filename that the error was raised in | 
			
		
	
		
			
				
					|  |  |  |  | 	 * @param integer $line the line number the error was raised at | 
			
		
	
		
			
				
					|  |  |  |  | 	 */ | 
			
		
	
		
			
				
					|  |  |  |  | 	public function handleError($code, $message, $file, $line) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		throw new \ErrorException($message, 0, $code, $file, $line); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |