禁用Xdebug转储捕获的异常

时间:2010-05-25 11:29:38

标签: php exception debugging xdebug

默认情况下,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但它的行为不符合预期(使用带有PHP 5.2的Xdebug v2.0.5)。 10在Ubuntu 9.10上。

2 个答案:

答案 0 :(得分:9)

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

  

xdebug.show_exception_trace

     

类型:整数,默认值:0

     

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

答案 1 :(得分: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