【发布时间】:2012-02-18 14:09:14
【问题描述】:
总结
令人惊讶的是,我在 Google 或 SO 上一无所获。当我在 PHP 中抛出异常时,它会在我的控制台中出现两次,并带有错误消息和堆栈跟踪。第一次打印时显示“PHP 致命错误:...”,第二次打印时仅显示“致命错误:...”。我没有测试这是Apache插件版本。
示例
为了安全起见,一些命名空间和路径用“...”缩短:
$ php 代码/com/.../tabular_data.php
PHP 致命错误:在 /home/codemonkey/.../tabular_data.php:56 中带有消息“不支持文件类型”的未捕获异常“异常”
堆栈跟踪:
#0 /home/codemonkey/.../tabular_data.php(88): com\...\Tabular_Data->loadFromFile('/home/codemonke...', false)
#1 /home/codemonkey/.../tabular_data.php(95): com\...\Tabular_Data::fromFile('/home/codemonke...')
#2 {主要}
在第 56 行的 /home/codemonkey/.../tabular_data.php 中抛出
致命错误:/home/codemonkey/.../tabular_data.php:56 中未捕获的异常“异常”和消息“不支持文件类型”
堆栈跟踪:
#0 /home/codemonkey/.../tabular_data.php(88): com\...\Tabular_Data->loadFromFile('/home/codemonke...', false)
#1 /home/codemonkey/.../tabular_data.php(95): com\...\Tabular_Data::fromFile('/home/codemonke...')
#2 {主要}
在第 56 行的 /home/codemonkey/.../tabular_data.php 中抛出
问题
我认为它与 stderr 和 stdout 都打印错误有关。无论如何,我如何很好地要求 PHP 只打印一次,最好打印到 stderr?
版本输出
PHP 5.3.9 (cli)(构建时间:2012 年 1 月 11 日 17:09:48)
版权所有 (c) 1997-2012 PHP Group
Zend Engine v2.3.0,版权所有 (c) 1998-2012 Zend Technologies
代码
http://pastebin.com/iBUGJ2eY
这是为我显示双重异常的确切代码,名称空间和路径编辑为 foos。请注意,在此安装中,我总是在命令行中遇到双重异常。我几乎可以肯定问题出在 PHP 配置上。
【问题讨论】:
-
是否涉及任何自定义错误处理程序?使用
5.3.9-1~dotdeb.3我似乎无法通过抛出异常来重现这一点。我只收到第二条消息。 -
您是否定义了任何自定义错误处理程序?您是否正在重定向错误输出或类似的东西?请展示一个最小的、完整的脚本来重现这个问题。
-
有问题的代码是一个类定义和一个类实例化。异常发生在实例化期间。这段代码还没有什么花哨的东西。以防万一你可以check it out here。这是令人印象深刻的不起眼和简短。出于好奇,我跑了
echo ini_get('error_reporting');,得到了32767。那是怎么回事?这不应该返回像 E_ALL 这样的字符串吗? -
E_ALL只是E_NOTICE、E_WARNING等的位掩码。试试print E_ALL;你会得到一个数字,因为它只是一个常数。