捕获到PHP异常,但仍会显示错误消息

时间:2012-01-12 12:21:13

标签: php exception error-handling

我使用PHP手册中的一些代码进行异常测试,但是我收到了一些奇怪的消息。

这是代码:

function inverse($x) {
    if (!$x) {
        throw new Exception('Division by zero.');
    }
    else return 1 / $x;
}

try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

// Continue execution
echo 'Hello World';

这是输出:

0.2
( ! ) Exception: Division by zero. in /var/www/OOPlearing/slash.php on line 10Call Stack#TimeMemoryFunctionLocation10.0002330188{main}(  )../slash.php:020.0002330232inverse( $x = 0 )../slash.php:17Dump $_SERVER$_SERVER['HTTP_HOST'] =string 'localhost' (length=9)$_SERVER['SERVER_NAME'] =string 'localhost' (length=9)Dump $_GETVariables in local scope (#2)$x =int 0
Caught exception: Division by zero.Hello World

奇怪的是,虽然已捕获异常,但异常消息仍然存在...

我在php.ini中的一些本地设置:

error_reporting = E_ALL & ~E_DEPRECATED
display_errors =On
display_startup_errors = Off
log_errors = Off
......
html_errors = On

我的笔记本:

ubuntu11.04
mysql  Ver 14.14 Distrib 5.1.54
PHP 5.3.5-1

更新(2012.1.16)这是导致此类错误输出的xdebug扩展。 xdebug默认显示错误条件下的堆栈跟踪。对于那些想要禁用它的人,可以在指令下面做:

xdebug_disable();//put it on the header of your code,like cofig file.

more details

4 个答案:

答案 0 :(得分:4)

当你尝试/ catch()一段代码时,你不会得到“未捕获异常”的致命错误。致命错误将导致脚本在错误点停止执行。既然你发现了异常,就按照你告诉它做的:回显字符串+错误信息,然后继续执行“Hello World!”。如果由于您的INI设置(例如堆栈跟踪打印输出),您的错误报告更加冗长。

答案 1 :(得分:3)

如果您不想禁用xdebug并且不希望显示跟踪消息,可以使用

关闭异常跟踪的显示。
xdebug.show_exception_trace = 0

在你的php.ini

答案 2 :(得分:1)

如果您不想显示错误,请关闭error_reporting和display_error。然后它将只显示异常打印出来的消息

答案 3 :(得分:0)

设置display_errors = off会为您提供所需的行为,但请注意,您不会收到任何错误消息或警告,因此除非您处于生产环境中,否则强烈建议您留下这个。

如果您不想关闭所有php的错误报告,可以执行以下操作之一:

  • 在您的脚本顶部设置<?php ini_set('display_errors', 0); ?>
  • 为您的网站创建虚拟主机(如果您还没有)并创建.htaccess并包含行php_flag display_errors "1"

希望这会有所帮助