如果我没有在PHP中捕获异常,我会在带有堆栈跟踪的error.log
文件中收到有用的错误消息。例如,如果我运行:
<?php
function foo() {
throw new Exception('Oh no!');
}
foo();
?>
然后我把这写到我的日志中:
[Wed Mar 06 10:35:32 2013] [错误] [客户端86.146.145.175] PHP致命 错误:未捕获的异常'异常',消息'哦不!'在 /var/www/test.php:4\nStack trace:\ n#0 /var/www/test.php(7): 第4行/var/www/test.php中抛出的foo()\ n#1 {main} \ n
有时我想捕获异常,但仍记录该细节。我想象的是:
<?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
之外,可能完全相同。< / p>
是否有内置函数来记录这样的异常信息,或将其捕获为字符串?我在想象Python中的traceback.format_exc()
类似的东西。
答案 0 :(得分:57)
error_log($e);
做你想要的。如果您没有捕获异常,它会记录与记录完全相同的内容,减去单词&#39; Uncaught&#39;在开始。这样做是因为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!");
});
答案 1 :(得分:6)
您可以使用PHP's base Exception
class中的方法。
使用getMessage
获取消息Oh no!
并使用getTraceAsString
获取格式化的跟踪。
答案 2 :(得分:4)
我们使用Monolog在我们的应用程序中进行日志记录。 Monolog有一个可以打印堆栈跟踪的格式化程序。要使用跟踪记录异常,我们使用LineFormatter并在其上调用includeStacktraces()。 (以下代码)
$handler = new \Monolog\Handler\StreamHandler(STDOUT);
$lineFormatter = new \Monolog\Formatter\LineFormatter();
$lineFormatter->includeStacktraces();
$handler->setFormatter($lineFormatter);
$logger = new \Monolog\Logger('root', [$handler]);
try {
//do some throwing
} catch (Exception $e) {
//do some logging, add exception to context
$logger->error($e->getMessage(), ['exception' => $e]);
}
答案 3 :(得分:-2)
您可以使用http://php.net/manual/en/function.set-exception-handler.php注册一个回调函数,该函数将从$ e-&gt; getMessage()获取消息;并将其转储到文件中。