php - 使用堆栈跟踪记录捕获的异常

标签 php exception logging

如果我没有在 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 :未捕获的异常.

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

最佳答案

error_log($e);

做你想做的。它记录的内容与您没有捕获到异常时所记录的内容完全相同,只是在开头减去“Uncaught”一词。它这样做是因为这就是 Exception class's __toString() magic method返回。

您可以在 catch block 中执行此操作:

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

或者在异常处理程序中:

set_exception_handler(function($exception) {
    error_log($exception);
    error_page("Something went wrong!");
});

关于php - 使用堆栈跟踪记录捕获的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15245184/

相关文章:

php - PHP 5.3 中的依赖注入(inject)

android - "Java.lang.NullPointerException"getWritableDatabase 方法异常

logging - 将基本Config.groovy log4j DSL转换为外部log4j.properties

c# - 带有 Func() 参数的 ASP.NET Core 日志记录

c# - 登录多线程异步代码

php - MySQL 在 'keys,puzzle,posX,posY,map)' 附近从 PHP 插入语法错误

php - MySQL 选择常量位于表数组中的位置

php - 从 Apache mod_authn_dbd 获取环境变量中的附加字段

java.lang.RuntimeException : ERROR: Failed to recover corrupt cache entry 错误

ios - collectionView 中的异常(_ :layout:sizeForItemAt:) when accessing layout. collectionViewContentSize