yii2框架的错误处理

在查找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设置了处理错误的方法。当有代码中有异常或者错误设置的时候,如果上层没有进一步的异常处理机制,就会被整个全局函数捕捉,并加以处理

相关文章
  1. $_GET,$_POST与urldecode的使用风险
  2. Yii2过滤器-behaviors()行为调用
  3. 密码保护:PHP多进程编程
  4. 全排列算法原理和实现
  5. PHP静态方法和非静态方法的使用场景
  6. uuid生成方案
本站版权
1、本站所有主题由该文章作者发表,该文章作者与尘埃享有文章相关版权
2、其他单位或个人使用、转载或引用本文时必须同时征得该文章作者和尘埃的同意
3、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
4、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
5、原文链接:
二维码
Posted in php, Yii2, 编程语言
Comments are closed.