在开发接口的时候,通常需要一套约定好的格式,来返回给前端处理,如果按照 Yii2 原来的异常处理机制,会非常的不友好,甚至会导致前端(比如强类型语言APP)崩溃。所以非常的需要一套全局异常处理来做这个事。
新建文件 UserErrorHandler 继承自 yii\web\ErrorHandler 代码如下:

<?php
/**
 * UserErrorHandler.php
 * 全局自定义错误处理
 * Created by Samdlcong.
 */

namespace api\components;

use api\helpers\LogHelper;
use yii\base\UserException;
use yii\web\ErrorHandler;
use yii\web\HttpException;
use Yii;
use yii\web\Response;

class UserErrorHandler extends ErrorHandler
{
    private $code = 0;
    private $msg = '';
    private $errorCode = 999;

    public function renderException($exception)
    {

        if (YII_DEBUG) {
            // 如果为开发模式时,可以按照之前的页面渲染异常,因为框架的异常渲染十分详细,方便我们寻找错误
            return parent::renderException($exception);
        } else {
            if ($exception instanceof HttpException) {
                $this->code = $exception->statusCode;
                $this->msg = $exception->getMessage();
                $this->errorCode = $exception->getCode();
            } else if ($exception instanceof UserException) {
                // 用户不适当的操作导致的异常
                $this->code = 200;
                $this->msg = $exception->getMessage();
                $this->errorCode = $exception->getCode();
            } else {
                // 出错了
                $this->code = 500;
                $this->msg = 'An internal server error occurred';
                $this->errorCode = 999;
            }

            $data = [
                'code' => $this->code,
                'msg' => $this->msg,
                'errorCode' => $this->errorCode,
            ];

            //记录错误日志
            LogHelper::log(print_r($data,true),'api_error_log');

            $response = Yii::$app->response;
            $response->statusCode = $this->code; //200
            $response->format = Response::FORMAT_JSON;
            $response->data = $data;

            $response->send();
        }
    }
}

主要是重写父类的 renderException 方法。如果是开发模式,则交回给父类处理,打印出详细的堆栈。
LogHelper 文件

<?php
/**
 * LogHelper.php
 *
 * Created by Samdlcong.
 */
namespace api\helpers;

use Yii;
class LogHelper{
    public static function log($message, $category='api_log'){
        $logEnable = Yii::$app->params['log_enable'];
        if(is_null($logEnable) || $logEnable == false) return;
        Yii::info(sprintf("\n\t%s\n\tmemory used %d bytes [%.3f KB]\n", $message, memory_get_usage(), memory_get_usage()/1024), $category);
    }
}

新建好文件后,在配置文件中替换成自己的文件,就可以了。

'components' => [
    'errorHandler' => [
        'class' => 'api\components\UserErrorHandler'
    ],
]