【问题标题】:PHP exception is caught, but error message still appearsPHP异常被捕获,但仍然出现错误消息
【发布时间】:2012-02-08 17:42:08
【问题描述】:

我使用 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

Update(2012.1.16) 导致此类错误输出的是 xdebug 扩展。 xdebug 默认显示错误情况下的堆栈跟踪。对于那些想要禁用它的人可以按照以下说明进行操作:

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

more details

【问题讨论】:

  • 您是否尝试将display_errors 设置为关闭?
  • 打开错误报告不是解决问题的方法;)
  • 我复制粘贴你的代码,它只显示 0.2 捕获的异常:除以零。你好世界。所以没问题
  • @rkosegi 这是由于 php 配置中错误报告的额外冗长......所以它实际上不是问题,它是它的工作方式......你的错误报告配置是什么php.ini?
  • @jere:你是对的,我的错误,error_reporting = E_ALL,但 display_error = Off

标签: php exception error-handling


【解决方案1】:

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

【讨论】:

  • ,所以我想知道哪个 ini 设置会导致额外的错误报告...我应该在这里粘贴我的 ini 设置的完整列表吗?
  • 同样的结果...可能 xdeug 影响了错误输出。我稍后会尝试禁用它...无论如何,谢谢...
【解决方案2】:

如果您不想禁用 xdebug 并且不希望出现跟踪消息,则可以使用以下命令关闭异常跟踪的显示

xdebug.show_exception_trace = 0

在你的 php.ini 中

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      设置 display_errors = off 会给你想要的行为,但请注意你不会收到 ANY 错误消息或警告,所以除非你在生产环境中,否则强烈建议你离开这个开。

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

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

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2013-12-13
        • 2018-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 2019-10-02
        相关资源
        最近更新 更多