TP3.2.2错误及异常处理的几点疑问?

浏览:1367 发布日期:2014/12/01 分类:求助交流 关键字: 异常 错误 处理 3.2.2
TP中的异常及错误处理都是使用了自定义处理,代码请参考文件:ThinkPHP/Library/Think/Think.class.php异常这里暂且不讨论,只说说错误处理。
注意后面代码加粗的部分!!


启动自定义处理代码如下:     
     // 设定错误和异常处理
      register_shutdown_function('Think\Think::fatalError');
      set_error_handler('Think\Think::appError');
fatalError方法如下:    // 致命错误捕获
    static public function fatalError() {
        Log::save();
        if ($e = error_get_last()) {
            switch($e['type']){
              case E_ERROR:
              case E_PARSE:
              case E_CORE_ERROR:
              case E_COMPILE_ERROR:
              case E_USER_ERROR:  
                ob_end_clean();
                self::halt($e);
                break;
            }
        }
    }
appError方法如下:    /**
     * 自定义错误处理
     * @access public
     * @param int $errno 错误类型
     * @param string $errstr 错误信息
     * @param string $errfile 错误文件
     * @param int $errline 错误行数
     * @return void
     */
    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;
      }
    }
对上面的处理方式有几点疑问:
第一、按照PHP官方手册的说法,set_error_handler()函数所注册的自定义处理错误,不能处理以下异常:E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR。 测试过的确如此,比如说,程序中出现了E_ERROR这种错误,是不会触发set_error_handler()这个所注册自定义处理函数的,那么appError()方法中的,这部分代码意义何在(加粗部分代码)?: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;
      }
    }
第二、按照ThinkPHP3.2.2手册上来说,如果打开了错误记录日志,而且设置了允许记录的错误级别,比如我这样设置:    'LOG_RECORD' => true, //开启
    'LOG_LEVEL'  =>'EMERG,ALERT,CRIT,ERR,WARN,NOTICE', //记录级别
那么按道理说,程序上如果出现了E_WRANING或E_NOTICE等,就会自动记录到日志中,但是上面的程序是这样写的: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'); //这里永远是NOTIC??
            break;

      }
    }
那appError()方法所捕捉到的所有错误,都被列为NOTIC级别,那么是否不妥?


这些自己从看ThinkPHP3.2.2中Think.class.php文件中,产生的一些疑问,希望有人告诉我答案,这是为什么TP官方会这些写的?谢谢!
最佳答案
评论( 相关
后面还有条评论,点击查看>>