CI框架源码完全分析之核心文件(异常处理)Exceptions.php

使用CI框架,我们通常使用一下三个函数处理错误:
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;
    }
}

转载注明地址: http://www.phpddt.com/php/ci-exceptions.html 尊重他人劳动成果就是尊重自己!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值