【问题标题】:Disabling Xdebug's dumping of caught exceptions禁用 Xdebug 对捕获的异常的转储
【发布时间】:2011-02-23 15:35:43
【问题描述】:

默认情况下,Xdebug 会转储任何异常,无论是否被捕获:

try {
    throw new Exception();
}
catch (Exception $e) {
}
echo 'life goes on';

在启用 XDebug 和默认设置的情况下,这段代码实际上会输出如下内容(格式很好):

( ! ) Exception: in /test.php on line 3 Call Stack
#   Time    Memory  Function    Location 1  0.0003  52596   {main}( )   ../test.php:0
life goes on

是否可以禁用此行为并让它只转储未捕获的异常?

提前致谢。

更新:我即将得出结论,这是一个错误,因为 xdebug.show_exception_trace 在默认情况下是禁用的,但它的行为并不像预期的那样(使用 Xdebug v2.0.5 和 PHP 5.2。 10 在 Ubuntu 9.10 上)。

【问题讨论】:

    标签: php exception debugging xdebug


    【解决方案1】:

    如果您的代码是命名空间的,catch 块应该引用\Exception -- 带有反斜杠 -- 如果没有反斜杠,那么 PHP 将在您当前的命名空间中查找 Exception。这通常会失败并将未捕获的异常传递给 Xdebug。

    以下代码将异常传递给 Xdebug:

    namespace foo;
    
    try {
        new \PDO(0);
    } catch (Exception $e) {
        echo "Caught!";
    }
    // Fatal error: Uncaught exception...
    

    在 Exception 之前添加反斜杠将在全局命名空间中查找(并找到)Exception

    namespace foo;
    
    try {
        new \PDO(0);
    } catch (\Exception $e) {
        echo "Caught!";
    }
    // Exception caught correctly
    

    手动抛出异常可能会令人困惑(这就是我在上面使用 PDO 的原因)。如果我们尝试从当前命名空间抛出一个异常,PHP 会告诉我们那里不存在异常:

    namespace foo;
    
    try {
        throw new Exception();
    } catch (Exception $e) {
        echo "Caught!";
    }
    // Fatal error: Class 'foo\Exception' not found
    

    在 catch 块中抛出没有全局引用的全局异常会失败:

    namespace foo;
    
    try {
        throw new \Exception();  // global Exception
    } catch (Exception $e) {
        echo "Caught!";
    }
    // Fatal error: Uncaught exception 'Exception' in...
    

    鉴于这一切,最好总是在 catch 的 Exception 前加上反斜杠。

    namespace foo;
    
    try {
        throw new \Exception();
    } catch (\Exception $e) {
        echo "Caught!";
    }
    // Exception caught correctly
    

    【讨论】:

      【解决方案2】:

      更改xdebug.show_exception_trace 选项(注意默认情况下未启用)。

      xdebug.show_exception_trace

      类型:整数,默认值:0

      当此设置设置为 1 时,Xdebug 将在引发异常时显示堆栈跟踪 - 即使实际捕获了此异常。

      【讨论】:

      • 我同意这与 xdebug.show_exception_trace 有关。我认为当设置为 0 时,它应该忽略捕获的异常,但不知何故,即使显式禁用它也不起作用。
      • 在#php.pecl @ EFNet 上与 Derick 交谈或使用错误跟踪器 bugs.xdebug.org
      • 这最后一条评论使您的答案完整:) 我肯定会报告这个错误,以防我仍然可以在 2.1.0RCx 中重现它。谢谢。
      • 这里有同样的问题。你报告了这个错误吗?
      猜你喜欢
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多