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官方会这些写的?谢谢!
最佳答案