禁用Xdebug捕获异常的转储

7

默认情况下,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默认情况下被禁用,但它并没有按预期方式运行(在Ubuntu 9.10上使用PHP 5.2.10和Xdebug v2.0.5)。

2个回答

10

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

xdebug.show_exception_trace

类型:整数,默认值:0

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


我同意这与xdebug.show_exception_trace有关。我认为当设置为0时,它应该忽略已捕获的异常,但即使明确禁用它,某种原因它也不能正常工作。 - nuqqsa
请在 EFNet 的 #php.pecl 上与 Derick 联系,或使用 http://bugs.xdebug.org/ 上的错误跟踪器。 - Artefacto
这个最后的评论让你的回答更完整 :) 如果我仍然可以在2.1.0RCx中复现它,我一定会报告这个错误。谢谢。 - nuqqsa
这里也遇到了同样的问题。你报告了这个 bug 吗? - Quamis

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 会告诉我们该命名空间下不存在 Exception:

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...

考虑到这一点,最好总是在捕获的Exception前加上反斜杠。
namespace foo;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接