php - 错误抑制器未按手册中的指示抑制未定义函数
问题描述
从手册:
警告 目前,“@”错误控制运算符前缀甚至会禁用将终止脚本执行的严重错误的错误报告。除其他外,这意味着如果您使用“@”来抑制某个函数的错误,并且它不可用或输入错误,则脚本将在那里死掉,而没有说明原因。
但是,此代码在运行时:
<?php
echo 'hello';
@foo();
echo 'earth';
显示和日志(对我而言):
PHP Fatal error: Uncaught Error: Call to undefined function foo() in /var/www/stackoverflow/error-suppressor.php:3
Stack trace:
#0 {main}
thrown in /var/www/stackoverflow/error-suppressor.php on line 3
这似乎与手册相反。我在这里想念什么?
此处使用的 PHP 版本:7.1.12。
解决方案
我假设本手册根本没有针对 PHP 7 进行更新。
PHP 7改变了错误的报告方式:
PHP 7 改变了 PHP 报告大多数错误的方式。不再通过 PHP 5 使用的传统错误报告机制报告错误,现在大多数错误都是通过抛出Error异常来报告的。
...
由于Error层次不继承自Exception,PHP 5 中使用
catch (Exception $e) { ... }
块处理未捕获异常的代码会发现这些Error不会被这些块捕获。需要catch (Error $e) { ... }
块或set_exception_handler()处理程序。
在 PHP 5.6.38 中,上述错误将被抑制,仅hello
被记录。这可以在这里看到。即使您打开所有错误报告也是如此error_reporting(-1)
,正如可以在此处看到的那样。同样,这与 PHP 手册相反:
传入值-1将显示所有可能的错误,即使在未来的 PHP 版本中添加了新的级别和常量
具有讽刺意味的是,如果您使用 关闭错误报告error_reporting(0)
,那么 PHP 7 中也将抑制错误消息。这可以在这里看到。
推荐阅读
- ssh - SSH - 权限被拒绝(公钥,密码)是什么意思?
- php - 如何解决 ORA-12154:在 Azure 中使用 PHP OCI8 oci_connect 时出现 TNS 错误
- reactjs - 打字稿通用修复
- javascript - 如何处理 Firestore 上的日期?
- node.js - 虽然验证和注册数据应显示在 mongodb 数据库中,但它显示此错误?
- javascript - 如何修改列表中一个元素的属性
- node.js - Docker、NodeJs、Vuejs:无法使用 localhost 访问
- python - 将接收到的json转换为字典,并保存到本地磁盘
- vue.js - Vuejs错误:属性或方法“产品”未在实例上定义,但在渲染期间引用
- java - 实体spring boot之间的关系