美文网首页
在bug中学习thinkPHP中的错误处理机制

在bug中学习thinkPHP中的错误处理机制

作者: 阳光的小mi | 来源:发表于2019-06-12 09:40 被阅读0次

1.前言

PHP的错误与异常是分开的两个概念,不会因为一个问题同时抛出错误与异常。而框架一般都有自己的错误和异常处理机制,当发现运行结果解释不通时,我们要学会如何去定位问题。

2. 发现问题

有一个写文件的方法,写入了一个不存在的文件,在thinkPHP和非框架环境中执行结果不一致。
代码示例如下:

function write_file()
{
    $data = 'hello world';
    $file_name = 'G:\logs\log.txt'; // G盘不存在
    try {
        error_log($data,3,$file_name);
    } catch(\Exception $e) {
      var_dump($e->getMessage());
    }
}
write_file();

2.1 thinkPHP执行

  • 执行情况:在thinkPHP中调用该函数,表现为,打印了异常错误,提示文件不存在,并且程序响应500;
  • 分析:程序报500说明触发了错误,打印了异常错误说明catch到了异常,也就是说,这一段代码既抛出了错误也抛出了异常。

2.2 脱离框架,使用CLI测试

  • 执行情况:新建test.php,采用CLI命令执行,程序报warning。
C:\Users\Desktop>php test.php
PHP Warning:  error_log(G:\logs\log.txt): failed to open stream: No such file or
 directory in C:\Users\Desktop\test.php on line 7
  • 分析:说明程序只抛出了错误。

3. 问题分析

本着错误与异常不会同时触发的原则,以及CLI测试情况,怀疑与框架有关。查阅thinkPHP文档和thinkPHP源码得知,框架源码中定义了set_error_handler()错误处理函数,对于未捕获的错误,框架会抛出一个异常。所以导致了上述方法在thinkPHP环境中表现为错误与异常一起抛出,而在自然环境下执行只抛出了错误。

thinkPHP错误触发异常文档说明
thinkPHP源码中定义的错误处理

相关文章

网友评论

      本文标题:在bug中学习thinkPHP中的错误处理机制

      本文链接:https://www.haomeiwen.com/subject/fulhfctx.html