在base.php文件中,用一句代码\think\Error::register();实现错误和异常处理机制的注册。
// 注册错误和异常处理机制
\think\Error::register();
 
打开library/think/Error.php,register函数如下:
/**
* 注册异常处理
* @access public
* @return void
*/
public static function register()
{
    error_reporting(E_ALL);                                 // 设置错误级别
    set_error_handler([__CLASS__, 'appError']);             // 设置错误处理方式
    set_exception_handler([__CLASS__, 'appException']);     // 设置异常处理
    register_shutdown_function([__CLASS__, 'appShutdown']); // 注册关闭函数
}
注:set_error_handler("myError") 、set_exception_handler("myException")、register_shutdown_function("myShutdown")不仅可以接受函数,还可以接受类的方法(公开的静态方法及公开的非静态方法),但需要以数组形式传递,数组的第一个值为“类名”,第二个值为“方法名”。
 
1、error_reporting()
error_reporting() 函数设置当前脚本的错误报告级别,规定报告哪种错误。E_ALL为显示所有的错误和警告信息,类似的级别还有E_ERROR—运行时致命的错误、E_WARNING—运行时非致命的错误、E_NOTICE-—运行时的通知。
 
2、set_error_handler()
set_error_handler指定appError来处理系统错误,捕获错误后把错误以异常的形式抛出。当程序出现错误的时候自动调用appError函数,该函数实例化了一个PHP自带的错误异常类ErrorException,如果符合异常处理的,就将错误信息以异常的形式抛出来,否则将错误信息写入日志中。
 
3、set_exception_handler()
set_exception_handler指定appException来处理用户抛出的异常,如果不是异常,就实例化ThrowableError类,将异常包装起来并抛出。
 
4、register_shutdown_function()
register_shutdown_function指定appShutdown处理超时异常。
 
到此,框架的错误和异常处理机制就注册完了。
 
在注册错误和异常处理机制中,都是使用getExceptionHandler方法来获取异常处理的实例。
/**
* 获取异常处理的实例
* @access public
* @return Handle
*/
public static function getExceptionHandler()
{
    static $handle;
 
    if (!$handle) {
        // 异常处理 handle
        $class = Config::get('exception_handle');
 
        if ($class && is_string($class) && class_exists($class) &&
            is_subclass_of($class, "\\think\\exception\\Handle")
        ) {
            $handle = new $class;
        } else {
            $handle = new Handle;
 
            if ($class instanceof \Closure) {
                $handle->setRender($class);
            }
 
        }
    }
 
    return $handle;
}
可以看到 $class = Config::get('exception_handle'); 这句代码,也就是可以通过修改配置参数来指定新的异常处理对象。
如果想使用自定义的错误和异常处理机制,首先在application/config.php文件中找到exception_handle的配置:
// 异常处理handle类 留空使用 \think\exception\Handle
'exception_handle'       => '',
指错误信息来自于\think\exception\Handle的方法,将其改为自己定义的Exception类:
// 异常处理handle类 留空使用 \think\exception\Handle
'exception_handle'       => 'thinkphp\library\exception\ExceptionHandler',
再按照配置新建文件,为thinkphp\library\exception\ExceptionHandler.php,重写这个Handle方法即可:
class ExceptionHandler extends Handle
{
    public function render(Exception $e)
    {
        return json('这里是自定义的错误');
        //return parent::render($e); // TODO: Change the autogenerated stub
    }
}
这样就可以使用自定义的错误和异常处理机制了。

ThinkPHP5.0源码学习之注册错误和异常处理机制的更多相关文章

  1. ThinkPHP5.0源码学习之注册自动加载

    ThinkPHP5框架的自动注册加载流程如下:

  2. ThinkPHP5.0源码学习之框架启动流程

    ThinkPHP5框架的启动流程图如下: ThinkPHP5的启动流程按照文件分为三步: 1.请求入口(public/index.php) 2.框架启动(thinkphp/start.php) 3.应 ...

  3. ThinkPHP5.0源码学习之缓存Cache(二)

    一.使用Cache类 TP5.0框架默认使用的是File文件缓存驱动,可以修改全局配置文件convention.php中的type,将其改为Redis,这样使用的就是Redis缓存驱动了.

  4. ThinkPHP5.0源码学习之缓存Cache(一)

    一.文件 1.缓存配置文件:thinkphp\convention.php 2.缓存文件:thinkphp\library\think\Cache.php 3.驱动目录:thinkphp\librar ...

  5. ThinkPHP5.0源码学习之执行应用

    一.应用启动 在/thinkphp/start.php文件中,用一句代码App::run()->send();实现应用的启动. // 执行应用 App::run()->send();   ...

  6. 【Spark2.0源码学习】-1.概述

          Spark作为当前主流的分布式计算框架,其高效性.通用性.易用性使其得到广泛的关注,本系列博客不会介绍其原理.安装与使用相关知识,将会从源码角度进行深度分析,理解其背后的设计精髓,以便后续 ...

  7. Spring5.0源码学习系列之浅谈BeanFactory创建

    Spring5.0源码学习系列之浅谈BeanFactory创建过程 系列文章目录 提示:Spring源码学习专栏链接 @ 目录 系列文章目录 博客前言介绍 一.获取BeanFactory主流程 二.r ...

  8. [Android FrameWork 6.0源码学习] View的重绘过程之WindowManager的addView方法

    博客首页:http://www.cnblogs.com/kezhuang/p/关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下<[Andr ...

  9. spark2.0源码学习

    [Spark2.0源码学习]-1.概述 [Spark2.0源码学习]-2.一切从脚本说起 [Spark2.0源码学习]-3.Endpoint模型介绍 [Spark2.0源码学习]-4.Master启动 ...

随机推荐

  1. 【UML】NO.54.EBook.6.UML.2.002-【Thinking In UML 大象 第二版】- UML 核心元素

    1.0.0 Summary Tittle:[UML]NO.54.EBook.6.UML.2.002-[Thinking In UML 大象 第二版]- UML 核心元素 Style:DesignPat ...

  2. 如果merge分支出现问题,使用git方式查看日志

    Administrator@IT-20161115IKEG MINGW32 ~$ cd e: Administrator@IT-20161115IKEG MINGW32 /e$ ls$RECYCLE. ...

  3. gitlab重置root的密码

    环境:gitlab 忘记了root密码,无法登陆gitlab 解决: gitlab-ctl start 保证gitlab处于启动状态,&保证redis处于启动状态 gitlab-rails c ...

  4. 使用Navicat定时备份mysql数据库和创建报表并邮件自动发送

    数据库备份在现代计算机高速发展的今日变得日益重要,程序员往往因为不重视而忽略备份数据,导致数据丢失,造成非常严重的后果.定时备份无疑是解决备份的最好的途径,本文主要使用Navicat来自动备份数据库和 ...

  5. HDU 1160

    FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take ...

  6. python3.x 读写文件要使用UTF8编码的话需要。。

    读写文件常遇到编码不正确的情况,都用UTF8读写文件就好了,在读写的时候加上编码格式:encoding='UTF-8'如下:with open(filename, 'r', encoding='UTF ...

  7. ajax返回数据为undefined

    在使用ajax异步请求后台返回数据后,使用console.log(data.message)打印返回数据,显示为undefined.苦恼了很久,终于在网上找到了答案. 先给大家看下异步代码: /*清零 ...

  8. laravel中empty(),is_null() 以及isEmpty()

    PHP中 empty() empty() 函数用于检查一个变量是否为空. if(empty($result->order)){ //操作 } is_null() is_null() 函数用于检测 ...

  9. RXD, tree and sequence IN HDU6065

    解这道题绕了好多弯路...先是把"depth of the least common ancestor"这句话忽视掉,以为是最深点与最浅点的深度差:看到某人题解(的开头)之后发现自 ...

  10. D2欧拉路,拓扑排序,和差分约束

    第一题:太鼓达人:BZOJ3033 题意:给出k,求一个最长的M位01串,使其从每一个位置向后走k个得到 的M个k位01串互不相同(最后一个和第一个相邻,即是一个环).输出 字典序最小的答案. 2 ≤ ...