在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
    }
}
这样就可以使用自定义的错误和异常处理机制了。

最新文章

  1. poj3122-Pie(二分法+贪心思想)
  2. NPM 无法下载任何包的原因,解决方法
  3. Upload java coed in Ubuntu(在Linux 16上,上传代码)
  4. out.print()和response.getWriter().write()区别
  5. svg path详解
  6. FCFS,SSTF,SCAN,FIFO,LRO考点题解
  7. Java编程思想学习(七) 抽象类和接口
  8. iOS系统版本简介
  9. cgic 写CGI程序
  10. JS-------DOM0级事件处理和DOM2级事件处理-------简单记法
  11. hadoop多机安装YARN
  12. [LeetCode226]Invert Binary Tree
  13. C# 常用接口学习 IComparable 和 IComparer
  14. 使用DBCP连接池对连接进行管理
  15. mybatis-java-依赖注入
  16. 利用PCA降维
  17. mysql锁2
  18. Linux 下 wordpress 无法安装插件
  19. mybatis3 date 的处理
  20. 【做题】sgu189 Perl-like Substr——dark模拟

热门文章

  1. SpringBoot2.0整合mybatis、shiro、redis实现基于数据库权限管理系统
  2. 7、LwIP协议规范翻译——网络接口
  3. JavaScript 模拟 Dictionary
  4. bugfree3.0.1-导入excel测试用例
  5. Ubuntu虚拟机识别不了SD卡的解决办法
  6. 公网k8s
  7. JMeter-充值-生成随机数
  8. ubuntu12.04下编译Linux tina 2.1/android经验
  9. 关闭图形界面下普通用户关机重启命令- 7.x - CentOS
  10. 关于view.py 中 ajax json 的用法