默认情况下,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上。
答案 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