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环境中表现为错误与异常一起抛出,而在自然环境下执行只抛出了错误。
![](https://img.haomeiwen.com/i5697896/cbc27d14d900d5ef.png)
![](https://img.haomeiwen.com/i5697896/a42e65a7f5ef55d0.png)
网友评论