错误处理机制的错误

浏览:4107 发布日期:2014/09/29
3.2.2 - 致命 - 未处理
最近使用sae,在未开启memcache的时候页面显示空白
实际内部发生了一连串的错误导致最后的致命错误
在 Think\Storage\Driver\Sae.class.php 文件内 $this->mc       =   @memcache_init();这一句执行sae的memcache初始化,未开启时导致了如下错误:

1.thinkphp系统执行时优先初始化文件存储方式(Think\Think.class.php):// 这里初始的是sae
define('STORAGE_TYPE',  'Sae');
// 初始化文件存储方式
Storage::connect(STORAGE_TYPE);
2.在未开启memcache的时候,这一句返回Warning错误
3.thinkphp的Think\Think::appError方法捕获了这一错误
4.当执行捕获后的处理时,执行了下面的代码,因为$errno=2
所有走了default分支static public function appError($errno, $errstr, $errfile, $errline) {
      switch ($errno) {
          case E_ERROR:
          case E_PARSE:
          case E_CORE_ERROR:
          case E_COMPILE_ERROR:
          case E_USER_ERROR:
            ob_end_clean();
            $errorStr = "$errstr ".$errfile." 第 $errline 行.";
            if(C('LOG_RECORD')) Log::write("[$errno] ".$errorStr,Log::ERR);
            self::halt($errorStr);
            break;
          default:
            $errorStr = "[$errno] $errstr ".$errfile." 第 $errline 行.";
            self::trace($errorStr,'','NOTIC');
            break;
      }
    }
5.然后执行trace方法:static public function trace($value='[think]',$label='',$level='DEBUG',$record=false) {
        static $_trace =  array();
        if('[think]' === $value){ // 获取trace信息
            return $_trace;
        }else{
            $info   =   ($label?$label.':':'').print_r($value,true);
            $level  =   strtoupper($level);
            
            if((defined('IS_AJAX') && IS_AJAX) || !C('SHOW_PAGE_TRACE')  || $record) {
                Log::record($info,$level,$record);
            }else{
                if(!isset($_trace[$level]) || count($_trace[$level])>C('TRACE_MAX_RECORD')) {
                    $_trace[$level] =   array();
                }
                $_trace[$level][]   =   $info;
            }
        }
    }
在执行trace方法时 因为调用了没有定义的C() 方法,所以发生了致命错误
因为@memcache_init(); @符号的存在导致错误被屏蔽了。
当去掉@符号时,显示下面的错误
Fatal error: Call to undefined function Think\C() in ThinkPHP/Library/Think/Think.class.php on line 334

Fatal error: Call to undefined function Think\C() in ThinkPHP/Library/Think/Think.class.php on line 313

该bug 可能是因为考虑runtime文件的加载时造成的,在加载Storage时,并未加载系统函数库
官方可以考虑优先加载系统函数库,以上为个人愚见,还望官方及早修复此问题
评论(
后面还有条评论,点击查看>>