CI框架源码完全分析之核心文件(异常处理)Exceptions.php
2014-02-11 00:00
886 查看
使用CI框架,我们通常使用一下三个函数处理错误:
show_error('消息' [, int $status_code = 500 ] )
show_404('页面' [, 'log_error'])
log_message('级别', '消息'),有一下三种错误信息:
错误类型的消息。 这种是真正的错误消息. 例如PHP错误或者用户错误。
调试类型的消息。 这种是用来帮助调试的消息。 例如, 如果当一个类被初始化时,你可以将这个初始化纪录下来,然后用于调试。
信息类型的消息。 这种是最低优先级别的消息,它只是简单的提供了关于运行的一些信息。 CodeIgniter 不会自动产生任何信息类型的消息,但是你可能会在你的程序里使用它
看看Exceptions类你就更明白了:
show_error('消息' [, int $status_code = 500 ] )
show_404('页面' [, 'log_error'])
log_message('级别', '消息'),有一下三种错误信息:
错误类型的消息。 这种是真正的错误消息. 例如PHP错误或者用户错误。
调试类型的消息。 这种是用来帮助调试的消息。 例如, 如果当一个类被初始化时,你可以将这个初始化纪录下来,然后用于调试。
信息类型的消息。 这种是最低优先级别的消息,它只是简单的提供了关于运行的一些信息。 CodeIgniter 不会自动产生任何信息类型的消息,但是你可能会在你的程序里使用它
看看Exceptions类你就更明白了:
/** * Exceptions Class */ class CI_Exceptions { var $action; var $severity; var $message; var $filename; var $line; //嵌套的输出缓冲处理程序的级别;如果输出缓冲区不起作用,返回零。 var $ob_level; //PHP error level var $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; } }
相关文章推荐
- PHP Fileinfo获取文件MIME类型
- libvirt/qemu特性之cpu hotplug
- PhpWind 8.7中禁止后台管理员随意修改会员用户名功能
- PHP学习笔记1 - MySQL免安装版配置
- php面向对象
- js在php 中出现 unterminated string literal 解决方法
- 诺基亚Lumia 920/820/620无法连接XP系统电脑的解决方法,MTP驱动
- thinkphp ajax检测是否数据可用
- php理论学习(一)
- PHP curl 采集内容之规则 及图片下载方法2
- PHP curl 采集内容之规则 1
- php 文件上传的基本方法
- php 验证码生成方法 及使用
- PHP 文字,图片水印,缩略图,裁切成小图(大小变小)
- PHP文件下载方式
- php 简单的验证码
- php MVC 及例子解释
- php 文件路径设置 set_include_path(); get_include_path();
- php解析url三个方法与实例
- PHP遍历并打印指定目录下所有文件