CI框架 -- 核心文件 之 Exceptions.php
使用CI框架,我们通常使用一下三个函数处理错误:
- 错误类型的消息。 这种是真正的错误消息. 例如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;
     }
 }
CI框架 -- 核心文件 之 Exceptions.php的更多相关文章
- CI框架 -- 核心文件 之 Hooks.php
		
钩子 - 扩展框架核心 CodeIgniter 的钩子特性提供了一种方法来修改框架的内部运作流程,而无需修改 核心文件.CodeIgniter 的运行遵循着一个特定的流程,你可以参考这个页面的 应用程 ...
 - CI框架 -- 核心文件 之 Common.php
		
system/core/Common.php 文件中可以定义 公共函数,我们可以在这里定义自己的公共函数.在任何情况下你都能够使用这些函数.使用他们不需要载入任何类库或辅助函数. 接下来分析下该文件中 ...
 - CI框架 -- 核心文件 之 Loader.php(加载器)
		
顾名思义,装载器就是加载元素的,使用CI时,经常加载的有: 加载类库文件:$this->load->library() 加载视图文件:$this->load->view() ...
 - CI框架 -- 核心文件 之 config.php
		
Config:该文件包含CI_Config类,这个类包含启用配置文件来管理的方法 /** * 加载配置文件 * * @param string $file 配置文件名 * @param bool $u ...
 - CI框架 -- 核心文件 之 Output.php(输出类文件)
		
CI输出类Output.php的功能是将最终web页面发送给浏览器,这里面的东西可能是你用的最少的.你使用装载器加载了一个视图文件, 这个视图文件的内容会自动传递给输出类对象, 然后呢,在方法执行完毕 ...
 - CI框架 -- 核心文件 之 Benchmark.php
		
Benchmark.php文件中定义的CI_Benchmark类可以让你标记点,并计算它们之间的时间差.还可以显示内存消耗. Benchmarking类库,它是被系统自动被加载的,不需要手工加载 cl ...
 - CI框架 -- 核心文件 之 Model.php
		
class CI_Model { /** * Class constructor * * @return void */ public function __construct() { log_mes ...
 - CI框架 -- 核心文件 之 Input.php(输入数据处理文件)
		
class CI_Input { //用户ip地址 protected $ip_address = FALSE; //用户浏览器地址 protected $user_agent = FALSE; // ...
 - CI框架 -- 核心文件 之 Lang.php(加载语言包)
		
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class CI_Lang { var $l ...
 
随机推荐
- 每日英语:Philippine Chapel Becomes a Medical Center
			
In the darkest moments of the killer storm that ripped across this coastal city on Friday, residents ...
 - DIOCP开源项目-高效稳定的服务端解决方案(DIOCP + 无锁队列 + ZeroMQ + QWorkers) 出炉了
			
[概述] 自从上次发布了[DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端]文章后,得到了很多朋友的支持和肯定.这加大了我的开发动力,经过几个晚上的熬夜,终于在昨天 ...
 - 【Mysql】Fedora下 Mysql 安装及配置
			
1.安装 Mysql Server # yum install mysql mysql-server 可以到mysql官网去下载,我下载的是通用版本.你需要下载下面四个文件就可以了. mysql-cl ...
 - webpack的代码分割/离
			
两种方法: 1.webpack的methods----require.ensure 2.ES 2015的Loader spec //require.ensure语法 require.ensure [] ...
 - 纯CSS3悬停图标旋转导航动画代码
			
分享一款纯CSS3悬停图标旋转导航动画代码.这是一款鼠标移到图标上动画旋转显示导航菜单.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div id="x_con ...
 - DFI、DPI技术
			
废话: 因为xxoo的缘故接触到这个设备.但是就是单纯的去看并没有去研究它是个啥玩意.刚才无聊就百度科普了一波. DFI以及DPI简单通俗以自己的理解来将就是网络带宽的一种检测技术.既然是检测技术也就 ...
 - [转]BigDecimal不整除异常
			
通过BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常的 异 常 :java.lang.ArithmeticException: Non-terminatin ...
 - [转]关于oracle with as用法
			
原文地址:https://www.cnblogs.com/linjiqin/archive/2013/06/24/3152667.html with as语法–针对一个别名with tmp as (s ...
 - json数据在前端(javascript)和后端(php)转换
			
学习目的:前后端数据交换 思路: json数据格式是怎么样? 后端各种语言怎么将自己内容转换成json格式的内容? 前端怎么接收json数据?有几种方式? js中怎么将json数据转换成js中的数 ...
 - Mac OS X上如何实现到Linux主机的ssh免登陆
			
转载说明: 本文转载自 http://www.aips.me/mac-key-ssh-login-linux.html 生成密钥对 用密码登录远程主机,将公钥拷贝过去 done 第一步:生成密匙对执行 ...