在查找yii2相关开发资料过程中发现很多人对yii2的错误处理流程不清楚,尤其是经常有一些疑惑,比如”为什么我的程序一旦出现问题,就会自动打印出错误呢?它是怎么监听的?在哪里用的try catch?”,下面我详细的描述一下错误处理流程。
预定义开启错误处理常量
# \yii\BaseYii.php /** * This constant defines whether error handling should be enabled. Defaults to true. */ defined('YII_ENABLE_ERROR_HANDLER') or define('YII_ENABLE_ERROR_HANDLER', true);
预定义默认组件errorHandler
yii2\web\Application.php
/** * @inheritdoc */ public function coreComponents() { return array_merge(parent::coreComponents(), [ 'request' => ['class' => 'yii\web\Request'], 'response' => ['class' => 'yii\web\Response'], 'session' => ['class' => 'yii\web\Session'], 'user' => ['class' => 'yii\web\User'], 'errorHandler' => ['class' => 'yii\web\ErrorHandler'], ]); }
运行时初始化注册错误处理机制registerErrorHandler
yii\base\Application.php
public function __construct($config = []) { Yii::$app = $this; $this->setInstance($this); $this->state = self::STATE_BEGIN; $this->preInit($config); $this->registerErrorHandler($config); Component::__construct($config); } # /** * 注册错误处理组件 * @param array $config application config */ protected function registerErrorHandler(&$config) { if (YII_ENABLE_ERROR_HANDLER) { if (!isset($config['components']['errorHandler']['class'])) { echo "Error: no errorHandler component is configured.\n"; exit(1); } $this->set('errorHandler', $config['components']['errorHandler']); unset($config['components']['errorHandler']); $this->getErrorHandler()->register(); } }
分析yii\web\ErrorHandler处理类register方法
/** * Register this error handler */ public function register() { ini_set('display_errors', false); set_exception_handler([$this, 'handleException']); set_error_handler([$this, 'handleError']); if ($this->memoryReserveSize > 0) { $this->_memoryReserve = str_repeat('x', $this->memoryReserveSize); } register_shutdown_function([$this, 'handleFatalError']); }
通过上面的方法,我们能看到,yii2通过全局异常处理函数set_exception_handler设置处理异常的方法,通过全部错误处理函数set_error_handler设置了处理错误的方法。当有代码中有异常或者错误设置的时候,如果上层没有进一步的异常处理机制,就会被整个全局函数捕捉,并加以处理