zoukankan      html  css  js  c++  java
  • ThinkPHP3.2.3 的异常和错误屏蔽处理

    一、入口文件关闭调试,配置文件配置异常页面

    在生产环境中系统的错误信息不能暴露给用户,入口文件的 APP_DEBUG 默认为开启状态

    define('APP_DEBUG',true);

    此时如果用户访问到不存在的模块、控制器或者方法会出现:

    在生产环境中需要把 APP_DEBUG 设置为 FALSE 或者将该定义屏蔽:

    define('APP_DEBUG',false);

    此时如果用户访问到不存在的模块、控制器或者方法会出现:

    这个错误的默认模板页在 ./ThinkPHP/Tpl/think_exception.tpl,可以设置自定义的异常页面来代替 ThinkPHP 默认的错误页面,在配置文件 config.php 中配置:

        //异常页面
        'TMPL_EXCEPTION_FILE' => './Public/Admin/error.html',

    在访问不存在的模块、控制器或方法时,会加载默认的或者自定义的异常页面模板。

    二、定义 EmptyController 类

    例如在 Admin 模块下创建一个 EmptyController.class.php,里面的 index 方法定义当用户访问一个不存在的控制器时系统该如何处理:

    <?php
    namespace AdminController;
    use ThinkController;
    
    class EmptyController extends Controller{
        public function index(){
           //跳转或加载404页
        }
    }

    三、定义空操作 _empty()

    例如在 Admin 模块的  Common 控制器中定义一个 _empty() 方法,当用户访问一个不存在的方法时,就会按照空方法中的设置进行处理:

        //空方法
        function _empty() {
            //跳转或加载404页
        }

    注:如果同时请求一个不存在的控制器和一个不存在的方法,或者请求一个不存在的模块时,会加载默认或者自定义的异常页面,而不会执行 EmptyController::index 或 _empty()。

    四、数据库错误

    在默认情况下,如果程序中的 SQL 语句出现了语法错误,很可能会把数据库信息暴露给用户:

    注:在 APP_DEBUG 为 TRUE 且没有自定义异常页面时发生数据库错误会输出以上信息。

    在关闭 APP_DEBUG 后,遇到数据库错误时,会加载默认的或者自定义的异常页面。如果希望在发生数据库错误时进行自定的处理时,可以在配置文件中设置数据库调试模式为 FALSE(该配置默认值是 TRUE):

    'DB_DEBUG'  =>  FALSE, // 数据库调试模式 开启后可以记录SQL日志 3.2.3新增

    当该选项开启时,会记录 SQL 日志,路径是 ./Application/Runtime/Logs/YourModule/

    但是当该选项开启时,无法自定义处理异常,只能加载系统默认或者自定义的一场模板。如果关闭该选项,同时在开发时与数据库相关的操作都必须捕获异常,例如:

            $result = M('session')->field('a')->select();
            if($result === false) {
                //处理
            }

    或者

    try {
        $result= M("session")->field('a')->select();
    } catch (Exception $e) {
        //处理
    }

    注:捕获异常可以参见 ./ThinkPHP/Library/Think/Db/Driver.class.php Line:169

            try{
                $result =   $this->PDOStatement->execute();
                // 调试结束
                $this->debug(false);
                if ( false === $result ) {
                    $this->error();
                    return false;
                } else {
                    return $this->getResult();
                }
            }catch (PDOException $e) {
                $this->error();
                return false;
            }
  • 相关阅读:
    coding++:拦截器拦截requestbody数据如何防止流被读取后数据丢失
    好记性-烂笔头:controller-接收参数方式及注意事项
    coding++:MySQL-ERROR:Column 'complaint_settlement_id' in field list is ambiguous
    coding++:SpringBoot 处理前台字符串日期自动转换成后台date类型的三种办法
    coding++:Arrays.asList()
    coding++:thymelef 模板报错 the entity name must immediately follow the '&' in the entity reference
    coding++:kafka问题:zookeeper is not a recognized option zookeeper参数不支持
    coding++:mybatis 嵌套查询子查询column传多个参数描述
    POJ 1816 Trie
    POJ 2945 Trie
  • 原文地址:https://www.cnblogs.com/dee0912/p/5140063.html
Copyright © 2011-2022 走看看