您的位置:首页 > 编程语言 > PHP开发

CI框架 -- 核心文件 之 Exceptions.php

2016-01-26 14:15 597 查看
使用CI框架,我们通常使用一下三个函数处理错误:

show_error('消息' [, int $status_code = 500 ] )
show_404('页面' [, 'log_error'])
log_message('级别', '消息'),有一下三种错误信息:

错误类型的消息。 这种是真正的错误消息. 例如PHP错误或者用户错误。

调试类型的消息。 这种是用来帮助调试的消息。 例如, 如果当一个类被初始化时,你可以将这个初始化纪录下来,然后用于调试。

信息类型的消息。 这种是最低优先级别的消息,它只是简单的提供了关于运行的一些信息。 CodeIgniter 不会自动产生任何信息类型的消息,但是你可能会在你的程序里使用它

class CI_Exceptions {
protected $action;
protected $severity;
protected $message;
protected $filename;
protected $line;

//嵌套的输出缓冲处理程序的级别;如果输出缓冲区不起作用,返回零。
protected $ob_level;

//PHP error level
protected $levels = array(
E_ERROR                =>    'Error',//致命错误
E_WARNING            =>    'Warning',//非致命运行错误
E_PARSE                =>    'Parsing Error',//编译错误
E_NOTICE            =>    'Notice',//notice错误
E_CORE_ERROR        =>    'Core Error',//PHP启动时致命错误
E_CORE_WARNING        =>    'Core Warning',     //PHP启动时非致命错误
E_COMPILE_ERROR        =>    'Compile Error',//致命的编译错误
E_COMPILE_WARNING    =>    'Compile Warning',//非致命的编译错误
E_USER_ERROR        =>    'User Error',//致命的用户生成错误
E_USER_WARNING        =>    'User Warning',//非致命的用户生成警告
E_USER_NOTICE        =>    'User Notice',//用户生成的通知
E_STRICT            =>    'Runtime Notice'//Run-time通知,提高代码稳定可靠性
);

public function __construct()
{
//获取嵌套的输出缓冲处理程序的级别
$this->ob_level = ob_get_level();
}

// --------------------------------------------------------------------

//记录错误日志
function log_exception($severity, $message, $filepath, $line)
{
$severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity];

log_message('error', 'Severity: '.$severity.'  --> '.$message. ' '.$filepath.' '.$line, TRUE);
}

// --------------------------------------------------------------------

/**
* 可以看出show_404只是show_error的一种特殊情况
*/
function show_404($page = '', $log_error = TRUE)
{
$heading = "404 Page Not Found";
$message = "The page you requested was not found.";

// 是否需要记录日志
if ($log_error)
{
log_message('error', '404 Page Not Found --> '.$page);
}

echo $this->show_error($heading, $message, 'error_404', 404);
exit;
}

// --------------------------------------------------------------------

//有意识的触发错误,如找不到控制器等
function show_error($heading, $message, $template = 'error_general', $status_code = 500)
{
//响应一个http头
set_status_header($status_code);

$message = '<p>'.implode('</p><p>', ( ! is_array($message)) ? array($message) : $message).'</p>';
/**
* 缓冲机制是有嵌套级别的,
* 这个if判断是说发生错误的缓冲级别和Exception被加载【刚开始】的缓冲级别相差1以上
* 看core/Loader.php中的_ci_load() CI在加载view的时候先ob_start(),然后由output处理输出,
*  因此,如果是在视图文件发生错误,则就会出现缓冲级别相差1的情况,此时先把输出的内容给flush出来,然后再把错误信息输出。
*/
if (ob_get_level() > $this->ob_level + 1)
{
ob_end_flush();
}

//输出缓冲内容
ob_start();
include(APPPATH.'errors/'.$template.'.php');
$buffer = ob_get_contents();
ob_end_clean();
return $buffer;
}

// --------------------------------------------------------------------

//PHP代码错误
function show_php_error($severity, $message, $filepath, $line)
{
$severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity];

$filepath = str_replace("\\", "/", $filepath);

// 为了安全起见,只显示最后两段路径
if (FALSE !== strpos($filepath, '/'))
{
$x = explode('/', $filepath);
$filepath = $x[count($x)-2].'/'.end($x);
}

if (ob_get_level() > $this->ob_level + 1)
{       //输出缓冲区内容并关闭缓冲
ob_end_flush();
}
ob_start();
include(APPPATH.'errors/error_php.php');
$buffer = ob_get_contents();
ob_end_clean();
echo $buffer;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: