61

如果我没有在 PHP 中捕获异常,我会在我的error.log文件中收到一条有用的错误消息,其中包含堆栈跟踪。例如,如果我运行:

<?php

  function foo() {
    throw new Exception('Oh no!');
  } 

  foo();

?>

然后我把它写到我的日志中:

[2013 年 3 月 6 日星期三 10:35:32] [错误] [客户端 86.146.145.175] PHP 致命错误:未捕获的异常“异常”,消息“哦,不!” 在 /var/www/test.php:4\n堆栈跟踪:\n#0 /var/www/test.php(7): foo()\n#1 {main}\n 抛出 /var/www/第 4 行的 test.php

有时我想捕捉异常但仍记录该详细信息。我在想像:

<?php

  function foo() {
    throw new Exception('Oh no!');
  } 

  try {
      foo();
  } catch (Exception $e) {
      log_exception($e);
  }

?>

wherelog_exception将以与为未捕获的异常自动写入的格式基本相同的格式向错误日志写入内容 - 除了具有Caught exception而不是PHP Fatal error: Uncaught exception.

是否有内置函数可以记录这样的异常信息,或者将其捕获到字符串中?我在想象一些类似于traceback.format_exc()Python 的东西。

4

4 回答 4

85
error_log($e);

做你想做的事。它记录的内容与您未捕获异常时记录的内容完全相同,只是在开头减去“未捕获”一词。它这样做是因为这就是Exception类的__toString()魔法​​方法返回的内容。

您可以在一个catch块中执行此操作:

try {
    foo();
} catch (Exception $e) {
    error_log("Caught $e");
}

或者在异常处理程序中:

set_exception_handler(function($exception) {
    error_log($exception);
    error_page("Something went wrong!");
});
于 2014-11-11T14:21:32.000 回答
10

您可以使用PHP 基Exception中的方法。

用于getMessage获取消息Oh no!并用于getTraceAsString获取格式化的跟踪。

于 2013-03-06T10:55:43.350 回答
7

我们使用 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]);
}
于 2018-03-23T09:53:53.003 回答
-3

您可以使用http://php.net/manual/en/function.set-exception-handler.php注册一个回调函数,该函数将从 $e->getMessage(); 获取消息 并将其转储到文件中。

于 2013-03-06T11:00:32.103 回答