Phalcon搭建多模块框架二十五:处理程序异常信息

由于程序在运行过程中往往会因为一些已知或者未知的错误导致异常,所以需要对这些异常进行处理。生产环境的异常我们不希望被用户看到,所以一般写入文件中。开发阶段往往直接打印出异常或者写到日志文件中调试。
这里写图片描述
1、打开config/config.php,添加

'application' => [
   'debug' => [
        'state' => false,
        'path' => BASE_PATH . 'runtime/debug/{YmdH}.log'
    ],
    'error' => [
        'path' => BASE_PATH . 'runtime/error/{YmdH}.log'
    ]
],

完整的config/config.php

<?php
/**
 * @desc 全局配置文件
 * @author zhaoyang
 * @date 2018年5月3日 下午7:54:47
 */
return [ 
    // 应用配置
    'application' => [
        'debug' => [
            'state' => false,
            'path' => BASE_PATH . 'runtime/debug/{YmdH}.log'
        ],
        'error' => [
            'path' => BASE_PATH . 'runtime/error/{YmdH}.log'
        ]
    ],
    // 服务配置
    'services' => [ 
        // mysql数据库配置
        'db' => [ 
            'host' => 'localhost',
            'port' => 3306,
            'username' => 'root',
            'password' => '123456',
            'dbname' => 'phalcon',
            'charset' => 'utf8',
            // 是否记录执行的mysql语句
            'logged' => true,
            // 记录执行时间超过0秒的mysql语句
            'max_execute_time' => 0,
            // 比较时间到小数点后几位
            'scale' => 5,
            'log_path' => BASE_PATH . 'runtime/mysql/{Y/m/d}/{YmdH}.log'
        ],
        // 调度器配置
        'dispatcher' => [ 
            // 处理 Not-Found错误配置
            'notfound' => [ 
                // 错误码及错误提示
                'status_code' => 404,
                'message' => 'Not Found',
                // 错误跳转的页面
                'namespace' => DEFAULT_MODULE_NAMESPACE . '\\Controllers',
                'controller' => 'error',
                'action' => 'error404'
            ]
        ],
        // volt引擎相关配置
        'view_engine_volt' => [ 
            // 编译模板目录
            'compiled_path' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/compiled/volt' . DS,
            // 是否实时编译
            'compile_always' => false,
            // 附加到已编译的PHP文件的扩展名
            'compiled_extension' => '.php',
            // 使用这个替换目录分隔符
            'compiled_separator' => '%%',
            // 是否要检查在模板文件和它的编译路径之间是否存在差异
            'stat' => true,
            // 模板前缀
            'prefix' => '',
            // 支持HTML的全局自动转义
            'autoescape' => false
        ],
        // 模板相关配置
        'view' => [ 
            // 模板后缀
            'view_suffix' => 'volt,phtml',
            // 模板路径
            'view_path' => APP_PATH . DEFAULT_MODULE . '/views' . DS,
            // 模板引擎,暂时支持viewEngineVolt or viewEnginePhp,与模板后缀一一对应
            'view_service' => 'viewEngineVolt,viewEnginePhp',
            'disable_level' => [
                'level_action_view' => false,
                'level_before_template' => true,
                'level_layout' => true,
                'level_after_template' => true,
                'level_main_layout' => true
            ]
        ],
        // 过滤器设置
        'filter' => [ 
            // 过滤类型,支持string、trim、absint、int、email、float、int!、float!、alphanum、striptags、lower、upper、url、special_chars
            'default_filter' => 'string,trim'
        ],
        // 文件日志,formatter常用line,adapter常用file
        'logger' => [ 
            'line' => [ 
                'format' => '[%date%][%type%] %message%',
                'date_format' => 'Y-m-d H:i:s'
            ],
            'file' => [ 
                'alert' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/alert/{Y/m/d}/{YmdH}.log',
                'critical' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/critical/{Y/m/d}/{YmdH}.log',
                'debug' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/debug/{Y/m/d}/{YmdH}.log',
                'error' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/error/{Y/m/d}/{YmdH}.log',
                'emergency' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/emergency/{Y/m/d}/{YmdH}.log',
                'info' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/info/{Y/m/d}/{YmdH}.log',
                'notice' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/notice/{Y/m/d}/{YmdH}.log',
                'warning' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/logs/warning/{Y/m/d}/{YmdH}.log'
            ]
        ],
        // session配置
        'session' => [ 
            // 是否自动开启 SESSION
            'auto_start' => true,
            'options' => [ 
                'adapter' => 'files',
                'unique_id' => DEFAULT_MODULE
            ]
            // @formatter:off
            /* // phalcon提供了四种适配器,分别是files、memcache、redis、libmemcached
            'options' => [
                'adapter'    => 'memcache',
                'unique_id' => DEFAULT_MODULE,
                'prefix' => DEFAULT_MODULE,
                'persistent' => true,
                'lifetime' => 3600
            ],
            'options' => [
                'adapter'    => 'redis',
                'unique_id' => DEFAULT_MODULE,
                'prefix' => DEFAULT_MODULE,
                'auth' => '',
                'persistent' => false,
                'lifetime' => 3600,
                'index' => 1
            ] */
            // @formatter:on
        ],
        // 加密配置
        'crypt' => [ 
            // 加密秘钥
            'key' => DEFAULT_MODULE,
            // 填充方式,默认是0(PADDING_DEFAULT),1(PADDING_ANSI_X_923)、2(PADDING_PKCS7)、3(PADDING_ISO_10126)、4(PADDING_ISO_IEC_7816_4)、5(PADDING_ZERO)、6(PADDING_SPACE)
            'padding' => '',
            // 加密方法,默认是"aes-256-cfb"
            'cipher' => ''
        ],
        // cookies配置
        'cookies' => [ 
            // 是否使用加密,使用加密必须要设置crypt 的key值
            'use_encryption' => true
        ],
        // 缓存配置
        'cache' => [ 
            'frontend' => [ 
                // 数据处理方式,支持data(序列化)、json、base64、none、output、igbinary、msgpack
                'data' => [ 
                    'lifetime' => 172800
                ],
                'output' => [
                    'lifetime' => 172800
                ]
            ],
            'backend' => [ 
                // 数据缓存方式,支持memcache、file、redis、mongo、apc、apcu、libmemcached、memory、xcache
                'file' => [ 
                    'cache_dir' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/cache/',
                    // 对保存的键名进行md5加密
                    'safekey' => true,
                    'prefix' => ''
                ],
                'memcache' => [ 
                    'host' => 'localhost',
                    'port' => '11211',
                    'persistent' => false,
                    'prefix' => '',
                    // 默认情况下禁用对缓存键的跟踪
                    'stats_key' => ''
                ],
                'redis' => [ 
                    'host' => '127.0.0.1',
                    'port' => 6379,
                    'auth' => '',
                    'persistent' => false,
                    'prefix' => '',
                    'stats_key' => '',
                    'index' => 0
                ]
            ]
        ],
        // 模型元数据缓存配置
        'models_metadata' => [ 
            'options' => [ 
                // 适配器,默认使用memory(内存),还支持apc、apcu、files、libmemcached、memcache、redis、session、xcache
                'adapter' => 'memcache',
                'unique_id' => DEFAULT_MODULE,
                'prefix' => DEFAULT_MODULE,
                'persistent' => false,
                'lifetime' => 3600
            ]
            // @formatter:off
            /* 'options' => [
                'adapter' => 'files',
                'meta_data_dir' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/models_metadata/'
            ],
            'options' => [
                'adapter'    => 'memcache',
                'unique_id' => DEFAULT_MODULE,
                'prefix' => DEFAULT_MODULE,
                'persistent' => true,
                'lifetime' => 3600
            ],
            'options' => [
                'adapter' => 'memory',
            ],
            'options' => [
                'adapter'    => 'redis',
                'unique_id' => DEFAULT_MODULE,
                'prefix' => DEFAULT_MODULE,
                'auth' => '',
                'persistent' => false,
                'lifetime' => 3600,
                'index' => 1
            ],
            'options' => [
                'adapter' => 'session',
                'prefix' => DEFAULT_MODULE,
            ] */
            // @formatter:on
        ],
        // 模型缓存配置
        'models_cache' => [ 
            'frontend' => [ 
                'adapter' => 'data',
                'lifetime' => 86400
            ],
            'backend' => [ 
                'adapter' => 'memcache'
            ]
        ],
        // 视图缓存配置
        'view_cache' => [
            'frontend' => [
                'adapter' => 'output',
                'lifetime' => 86400
            ],
            'backend' => [
                'adapter' => 'file',
                'cache_dir' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/cache/view/',
                'prefix' => ''
            ]
        ],
        // url配置
        'url' => [
            'base_uri' => '/',
            'static_base_uri' => '/',
            'base_path' => ''
        ],
        'flash' => [
            // 消息class属性值
            'css_classes' => [
                'error' => 'alert alert-danger',
                'success' => 'alert alert-success',
                'notice' => 'alert alert-info',
                'warning' => 'alert alert-warning'
            ],
            // 是否在生成的html中设置自动转义模式
            'autoescape' => true,
            // 是否必须使用HTML隐式格式化输出
            'automatic_html' => true,
            // 是否立即输出,为true时,调用$this->flash->message()或其他设置消息(例如success)时,消息立即输出(echo)
            // 为false时,消息不会输出,会保存在flash对象中并返回消息$res = $this->flash->success('my message');
            'implicit_flush' => false
        ],
        'flash_session' => [
            // 消息class属性值
            'css_classes' => [
                'error' => 'alert alert-danger',
                'success' => 'alert alert-success',
                'notice' => 'alert alert-info',
                'warning' => 'alert alert-warning'
            ],
            // 是否在生成的html中设置自动转义模式
            'autoescape' => true,
            // 是否必须使用HTML隐式格式化输出
            'automatic_html' => true,
            // 是否立即输出,必须设为true(默认为true),否则调用->output()不输出
            'implicit_flush' => true
        ],
        // 安全配置
        'security' => [
            // 设置由openssl伪随机生成器生成的字节数
            'random_bytes' => 16,
            // 设置默认hash,0=7(CRYPT_BLOWFISH_Y),1(CRYPT_STD_DES),2(CRYPT_EXT_DES),3(CRYPT_MD5),4(CRYPT_BLOWFISH),5(CRYPT_BLOWFISH_A),6(CRYPT_BLOWFISH_X),8(CRYPT_SHA256),9(CRYPT_SHA512)
            'default_hash' => 7,
            'work_factor' =>8
        ]
    ]

];

2、打开home模块下的配置文件app/home/config/confg.php添加

'application' => [
   'debug' => [
        'state' => true,
        'path' => ''//BASE_PATH . 'runtime/' . MODULE_NAME . '/debug/{YmdH}.log'
    ],
    'error' => [
        'path' => BASE_PATH . 'runtime/' . MODULE_NAME . '/error/{YmdH}.log'
    ]
],

完整的app/home/config/confg.php

<?php
// 模块名称
defined('MODULE_NAME') || define('MODULE_NAME', 'home');
// 模块命名空间
defined('MODULE_NAMESPACE') || define('MODULE_NAMESPACE', APP_NAMESPACE . '\\Home');

return [ 
    // 需要注册的模块命名空间
    'module_namespaces' => [ 
        MODULE_NAMESPACE . '\\Controllers' => APP_PATH . MODULE_NAME . '/controllers' . DS,
        MODULE_NAMESPACE . '\\Models' => APP_PATH . MODULE_NAME . '/models' . DS
    ],
    // 模块默认的命名空间
    'module_default_namespaces' => MODULE_NAMESPACE . '\\Controllers',
    // 应用配置
    'application' => [
        'debug' => [
            'state' => true,
            'path' => ''//BASE_PATH . 'runtime/' . MODULE_NAME . '/debug/{YmdH}.log'
        ],
        'error' => [
            'path' => BASE_PATH . 'runtime/' . MODULE_NAME . '/error/{YmdH}.log'
        ]
    ],
    // 服务配置
    'services' => [ 
        // 调度器配置
        'dispatcher' => [ 
            // 处理 Not-Found错误配置
            'notfound' => [ 
                // 错误码及错误提示
                'status_code' => 404,
                'message' => 'Not Found',
                // 错误跳转的页面
                'namespace' => MODULE_NAMESPACE . '\\Controllers',
                'controller' => 'error',
                'action' => 'error404'
            ]
        ],
        // volt引擎相关配置
        'view_engine_volt' => [ 
            // 编译模板目录
            'compiled_path' => BASE_PATH . 'runtime/' . MODULE_NAME . '/compiled/volt' . DS,
            // 是否实时编译
            'compile_always' => false,
            // 附加到已编译的PHP文件的扩展名
            'compiled_extension' => '.php',
            // 使用这个替换目录分隔符
            'compiled_separator' => '%%',
            // 是否要检查在模板文件和它的编译路径之间是否存在差异
            'stat' => true,
            // 模板前缀
            'prefix' => '',
            // 支持HTML的全局自动转义
            'autoescape' => false
        ],
        // 模板相关配置
        'view' => [ 
            // 模板后缀
            'view_suffix' => 'volt,phtml',
            // 模板路径
            'view_path' => APP_PATH . MODULE_NAME . '/views' . DS,
            // 模板引擎,暂时支持viewEngineVolt or viewEnginePhp,与模板后缀一一对应
            'view_service' => 'viewEngineVolt,viewEnginePhp',
            'disable_level' => [
                'level_action_view' => false,
                'level_before_template' => true,
                'level_layout' => true,
                'level_after_template' => true,
                'level_main_layout' => true
            ]
        ],
        // 过滤器设置
        'filter' => [ 
            // 过滤类型,支持string、trim、absint、int、email、float、int!、float!、alphanum、striptags、lower、upper、url、special_chars
            'default_filter' => 'string,trim'
        ],
        // 文件日志,formatter常用line,adapter常用file
        'logger' => [ 
            'line' => [ 
                'format' => '[%date%][%type%] %message%',
                'dateFormat' => 'Y-m-d H:i:s'
            ],
            'file' => [ 
                'alert' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/alert/{Y/m/d}/{YmdH}.log',
                'critical' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/critical/{Y/m/d}/{YmdH}.log',
                'debug' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/debug/{Y/m/d}/{YmdH}.log',
                'error' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/error/{Y/m/d}/{YmdH}.log',
                'emergency' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/emergency/{Y/m/d}/{YmdH}.log',
                'info' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/info/{Y/m/d}/{YmdH}.log',
                'notice' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/notice/{Y/m/d}/{YmdH}.log',
                'warning' => BASE_PATH . 'runtime/' . MODULE_NAME . '/logs/warning/{Y/m/d}/{YmdH}.log'
            ]
        ],
        'session' => [ 
            'auto_start' => true,
            'options' => [ 
                'adapter' => 'memcache',
                'unique_id' => MODULE_NAME,
                'prefix' => MODULE_NAME,
                'persistent' => true,
                'lifetime' => 3600
            ]
        ],
        // 加密配置
        'crypt' => [ 
            // 加密秘钥
            'key' => MODULE_NAME,
            // 填充方式,默认是0(PADDING_DEFAULT),1(PADDING_ANSI_X_923)、2(PADDING_PKCS7)、3(PADDING_ISO_10126)、4(PADDING_ISO_IEC_7816_4)、5(PADDING_ZERO)、6(PADDING_SPACE)
            'padding' => '',
            // 加密方法,默认是"aes-256-cfb"
            'cipher' => ''
        ],
        // cookies配置
        'cookies' => [ 
            // 是否使用加密,使用加密必须要设置crypt 的key值
            'use_encryption' => true
        ],
        // 缓存配置
        'cache' => [ 
            'backend' => [ 
                // 数据缓存方式,支持memcache、file、redis、mongo、apc、apcu、libmemcached、memory、xcache
                'file' => [ 
                    'cache_dir' => BASE_PATH . 'runtime/' . MODULE_NAME . '/cache/'
                ]
            ]
        ],
        // 模型元数据缓存配置
        'models_metadata' => [
            'options' => [
                // 适配器,默认使用memory(内存),还支持apc、apcu、files、libmemcached、memcache、redis、session、xcache
                'adapter' => 'files',
                'meta_data_dir' => BASE_PATH . 'runtime/' . MODULE_NAME . '/models_metadata/'
            ]
        ],
        // 模型缓存配置
        'models_cache' => [
            'frontend' => [
                'adapter' => 'data',
                'lifetime' => 86400
            ],
            'backend' => [
                'adapter' => 'memcache',
                'unique_id' => MODULE_NAME,
                'prefix' => MODULE_NAME,
                'persistent' => false,
                'lifetime' => 3600
            ]
        ],
        // 视图缓存配置
        'view_cache' => [
            'frontend' => [
                'adapter' => 'output',
                'lifetime' => 20
            ],
            'backend' => [
                'adapter' => 'file',
                'cache_dir' => BASE_PATH . 'runtime/' . MODULE_NAME . '/cache/view/',
                'safekey' => false,
                'prefix' => ''
            ]
        ],
        // url配置
        'url' => [
            'base_uri' => '/' . MODULE_NAME . '/',
            'static_base_uri' => '/' . MODULE_NAME . '/static/',
            'base_path' => ''
        ],
        'flash' => [
            // 消息class属性值
            'css_classes' => [
                'error' => 'alert alert-danger',
                'success' => 'alert alert-success',
                'notice' => 'alert alert-info',
                'warning' => 'alert alert-warning'
            ],
            // 是否在生成的html中设置自动转义模式
            'autoescape' => true,
            // 是否必须使用HTML隐式格式化输出
            'automatic_html' => true,
            // 是否立即输出,为true时,调用$this->flash->message()或其他设置消息(例如success)时,消息立即输出(echo)
            // 为false时,消息不会输出,会保存在flash对象中并返回消息$res = $this->flash->success('my message');
            'implicit_flush' => false
        ],
        'flash_session' => [
            // 消息class属性值
            'css_classes' => [
                'error' => 'alert alert-danger',
                'success' => 'alert alert-success',
                'notice' => 'alert alert-info',
                'warning' => 'alert alert-warning'
            ],
            // 是否在生成的html中设置自动转义模式
            'autoescape' => true,
            // 是否必须使用HTML隐式格式化输出
            'automatic_html' => true,
            // 是否立即输出,必须设为true,否则调用->output()不输出
            'implicit_flush' => true
        ],
        // 安全配置
        'security' => [
            // 设置由openssl伪随机生成器生成的字节数
            'random_bytes' => 16,
            // 设置默认hash,0=7(CRYPT_BLOWFISH_Y),1(CRYPT_STD_DES),2(CRYPT_EXT_DES),3(CRYPT_MD5),4(CRYPT_BLOWFISH),5(CRYPT_BLOWFISH_A),6(CRYPT_BLOWFISH_X),8(CRYPT_SHA256),9(CRYPT_SHA512)
            'default_hash' => 7,
            'work_factor' =>8
        ]
    ]
];

3、打开入口文件public/index.php修改catch
当然也可以根据不同的异常类型来做不同处理

catch (\Throwable $e) {
    $previous = $e->getPrevious();
    $applicationConfig = $application->config->application;
    if ($applicationConfig->debug->state ?? false) {
        if (empty($applicationConfig->debug->path)) {
            echo 'Exception: <br/>', '所在文件:', $e->getFile(), '<br/>所在行:', $e->getLine(), '<br/>错误码:', $e->getCode(), '<br/>错误消息:', $e->getMessage();
            if (!is_null($previous)) {
                echo '<br/>前一个Exception: <br/>', '所在文件:', $previous->getFile(), '<br/>所在行:', $previous->getLine(), '<br/>错误码:', $previous->getCode(), '<br/>错误消息:', $previous->getMessage();
            }
            exit();
        }
        $errorFile = $applicationConfig->debug->path;
        $errorType = 'debug';
    } else {
        $errorFile = $applicationConfig->error->path;
        $errorType = 'error';
    }
    $errorMessage = 'Exception: [所在文件:' . $e->getFile() . '] [所在行:' . $e->getLine() . '] [错误码:' . $e->getCode() . '] [错误消息:' . $e->getMessage() . '] '/*  . PHP_EOL . '[异常追踪信息:' . $e->getTraceAsString() . ']' */;
    if (!is_null($previous)) {
        $errorMessage .= '  前一个Exception: [所在文件:' . $previous->getFile() . '] [所在行:' . $previous->getLine() . '] [错误码:' . $previous->getCode() . '] [错误消息:' . $previous->getMessage() . '] '/*  . PHP_EOL . '[异常追踪信息:' . $previous->getTraceAsString() . ']' */;
    }
    $application->di->get('logger', [$errorFile])->$errorType($errorMessage);
}

完整的public/index.php

<?php
/**
 * @desc 入口文件
 * @author zhaoyang
 * @date 2018年5月3日 下午5:16:27
 */
use \Phalcon\Mvc\Application;

// 检查版本,搭建用到php7一些新特性
version_compare(PHP_VERSION, '7.0.0', '>') || exit('Require PHP > 7.0.0 !');
extension_loaded('phalcon') || exit('Please open the Phalcon extension !');

// phalcon版本
define('PHALCON_VERSION', Phalcon\Version::get());

version_compare(PHP_VERSION, '3.0.0', '>') || exit('Require Phalcon > 3.0.0 !');

// error_reporting(E_ALL & ~E_NOTICE);

// 设置时区
date_default_timezone_set('Asia/Shanghai');

//重新命名文件分隔符,建议路径后面加上分隔符
define('DS', DIRECTORY_SEPARATOR);

// 应用程序名称(应用程序所在目录名)
define('APP_NAME', 'app');

// 顶级命名空间
define('APP_NAMESPACE', 'App');

// 项目根目录
define('BASE_PATH', dirname(__DIR__) . DS);

// 应用程序所在目录
define('APP_PATH', BASE_PATH . APP_NAME . DS);

// 模块列表
// @formatter:off
define('MODULE_ALLOW_LIST', ['home', 'admin']);
// @formatter:on

// 默认模块
define('DEFAULT_MODULE', 'home');

// 默认模块命名空间
define('DEFAULT_MODULE_NAMESPACE', APP_NAMESPACE . '\Home');

try {
    // 引入配置文件
    $config = require BASE_PATH . 'config/config.php';

    // 引入自动加载配置
    require BASE_PATH . 'config/loader.php';

    // 引入路由规则
    $routerRules = require BASE_PATH . 'config/routers.php';

    // 引入注册服务
    require BASE_PATH . 'config/services.php';

    // 处理请求
    $application = new Application($di);

    // 组装应用程序模块
    $modules = [ ];
    foreach (MODULE_ALLOW_LIST as $v) {
        $modules[$v] = [ 
            'className' => APP_NAMESPACE . '\\' . ucfirst($v) . '\Module',
            'path' => APP_PATH . $v . '/Module.php'
        ];
    }
    // 加入模块分组配置
    $application->registerModules($modules);

    // 输出请求内容
    echo $application->handle()->getContent();
} catch (\Throwable $e) {
    $previous = $e->getPrevious();
    $applicationConfig = $application->config->application;
    if ($applicationConfig->debug->state ?? false) {
        if (empty($applicationConfig->debug->path)) {
            echo 'Exception: <br/>', '所在文件:', $e->getFile(), '<br/>所在行:', $e->getLine(), '<br/>错误码:', $e->getCode(), '<br/>错误消息:', $e->getMessage();
            if (!is_null($previous)) {
                echo '<br/>前一个Exception: <br/>', '所在文件:', $previous->getFile(), '<br/>所在行:', $previous->getLine(), '<br/>错误码:', $previous->getCode(), '<br/>错误消息:', $previous->getMessage();
            }
            exit();
        }
        $errorFile = $applicationConfig->debug->path;
        $errorType = 'debug';
    } else {
        $errorFile = $applicationConfig->error->path;
        $errorType = 'error';
    }
    $errorMessage = 'Exception: [所在文件:' . $e->getFile() . '] [所在行:' . $e->getLine() . '] [错误码:' . $e->getCode() . '] [错误消息:' . $e->getMessage() . '] '/*  . PHP_EOL . '[异常追踪信息:' . $e->getTraceAsString() . ']' */;
    if (!is_null($previous)) {
        $errorMessage .= '  前一个Exception: [所在文件:' . $previous->getFile() . '] [所在行:' . $previous->getLine() . '] [错误码:' . $previous->getCode() . '] [错误消息:' . $previous->getMessage() . '] '/*  . PHP_EOL . '[异常追踪信息:' . $previous->getTraceAsString() . ']' */;
    }
    $application->di->get('logger', [$errorFile])->$errorType($errorMessage);
}

4、打开home模块下的IndexController.php控制器文件,添加

public function testAction() {
        // throw new \Exception('系统错误');

        // $this->config->application->debug->state = false;// 错误会写入error下的path文件中
        try {
            $this->test1();
        } catch (\Exception $e) {
            throw new Exception('系统错误:' . $e->getMessage(), -10000, $e);
        }
        throw new Exception('test错误');
    }

    public function test1() {
        throw new Exception('test1错误');
    }

完整的IndexController.php

<?php
namespace App\Home\Controllers;

use Common\BaseController;
use Phalcon\Application\Exception;

class IndexController extends BaseController {

    public function indexAction() {
        echo __METHOD__, '<br>';
        var_dump($this->get());
        exit();
    }

    public function testAction() {
        // throw new \Exception('系统错误');

        // $this->config->application->debug->state = false;// 错误会写入error下的path文件中
        try {
            $this->test1();
        } catch (\Exception $e) {
            throw new Exception('系统错误:' . $e->getMessage(), -10000, $e);
        }
        throw new Exception('test错误');
    }

    public function test1() {
        throw new Exception('test1错误');
    }
}

5、访问/home/index/test
这里写图片描述
将$this->config->application->debug->state = false;取消注释
再次访问/home/index/test,不会有任何输出,但可以看到runtime/home下生成了一个error目录
这里写图片描述
打开日志文件,可以看到

[2018-06-10 21:31:40][ERROR] Exception: [所在文件:D:\wamp\www\phalcon\app\home\controllers\IndexController.php] [所在行:22] [错误码:-10000] [错误消息:系统错误:test1错误]   前一个Exception: [所在文件:D:\wamp\www\phalcon\app\home\controllers\IndexController.php] [所在行:28] [错误码:0] [错误消息:test1错误] 

猜你喜欢

转载自blog.csdn.net/u014691098/article/details/80645098
今日推荐