简介
惊人的是,我在谷歌或SO上找不到这方面的任何信息。当我在PHP中抛出异常时,它会在控制台上打印两次,完整地显示错误消息和堆栈跟踪。第一次打印时,它会显示“PHP致命错误:...”,而第二次只显示“致命错误:...”。我尚未测试Apache插件版本。
示例
为了保密,使用“…”缩短了一些命名空间和路径:
$ php code/com/.../tabular_data.php PHP Fatal error: Uncaught exception 'Exception' with message 'File type not supported' in /home/codemonkey/.../tabular_data.php:56 Stack trace: #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 {main} thrown in /home/codemonkey/.../tabular_data.php on line 56
Fatal error: Uncaught exception 'Exception' with message 'File type not supported' in /home/codemonkey/.../tabular_data.php:56 Stack trace: #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 {main} thrown in /home/codemonkey/.../tabular_data.php on line 56
问题
我认为这与stderr和stdout都打印错误有关。无论如何,我该如何礼貌地要求PHP仅打印一次,并最好将其打印到stderr?
版本输出
PHP 5.3.9 (cli) (built: Jan 11 2012 17:09:48)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0,版权所有(c) 1998-2012 Zend Technologies
代码
http://pastebin.com/iBUGJ2eY
这是能让我出现双重异常的完整代码,其中名称空间和路径已编辑成 foos。请注意,在此安装中,我始终在命令行中获得双重异常。我相信问题出在PHP配置上。
5.3.9-1~dotdeb.3
版本,似乎无法通过抛出异常来重现此问题。我只能得到第二个消息。 - Linus KleenE_ALL
只是E_NOTICE
、E_WARNING
等位掩码的组合。尝试使用print E_ALL
;你将得到一个数字,因为它只是一个常量。 - Linus Kleen