通过堆栈跟踪记录捕获到的异常
如果我没有在PHP中发现异常,我会在带有堆栈跟踪的error.log
文件中收到一条有用的错误消息。例如,如果我运行:通过堆栈跟踪记录捕获到的异常
<?php
function foo() {
throw new Exception('Oh no!');
}
foo();
?>
然后我得到这个写我的日志:
[Wed Mar 06 10:35:32 2013] [error] [client 86.146.145.175] PHP Fatal error: Uncaught exception 'Exception' with message 'Oh no!' in /var/www/test.php:4\nStack trace:\n#0 /var/www/test.php(7): foo()\n#1 {main}\n thrown in /var/www/test.php on line 4
有时候我想捕获异常,但仍日志细节。我想象类似:
<?php
function foo() {
throw new Exception('Oh no!');
}
try {
foo();
} catch (Exception $e) {
log_exception($e);
}
?>
其中log_exception
将写在基本相同的格式错误日志的东西得到什么未被捕捉异常的自动写入 - 也许除了具有Caught exception
代替PHP Fatal error: Uncaught exception
字面上完全相同。
是否有内置的函数来记录这样的异常信息,或将其捕获到字符串?我想象的是Python中的traceback.format_exc()
。
error_log($e);
做你想做的。如果没有发现异常,它会记录与记录完全相同的内容,在开始时减去“Uncaught”一词。它这样做是因为这就是Exception
class's __toString()
magic method返回的结果。
您可以在catch
块做到这一点:
try {
foo();
} catch (Exception $e) {
error_log("Caught $e");
}
还是在异常处理程序:
set_exception_handler(function($exception) {
error_log($exception);
error_page("Something went wrong!");
});
您可以使用http://php.net/manual/en/function.set-exception-handler.php来注册一个回调函数,它将从$ e-> getMessage()获取消息;并将其转储到文件。
描述说,这种设置对于未捕获的异常处理程序,而这恰恰不是这样的我在问。 – 2013-03-06 23:21:56
非常有用的答案来理解它。 – kta 2017-04-14 08:14:56