PHP异常被捕获,但仍然出现错误信息

zhk*_*yth 5 php error-handling exception

我使用 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';
Run Code Online (Sandbox Code Playgroud)

这是输出:

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
Run Code Online (Sandbox Code Playgroud)

奇怪的是,虽然已经捕获到异常,但是异常信息还在...

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

error_reporting = E_ALL & ~E_DEPRECATED
display_errors =On
display_startup_errors = Off
log_errors = Off
......
html_errors = On
Run Code Online (Sandbox Code Playgroud)

我的笔记本:

ubuntu11.04
mysql  Ver 14.14 Distrib 5.1.54
PHP 5.3.5-1
Run Code Online (Sandbox Code Playgroud)

更新(2012.1.16)是 xdebug 扩展导致了这样的错误输出。xdebug 默认显示错误情况下的堆栈跟踪。对于那些想要禁用它的人可以执行以下说明:

xdebug_disable();//put it on the header of your code,like cofig file.
Run Code Online (Sandbox Code Playgroud)

更多细节

ddu*_*ubs 5

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