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

2022-08-30 09:30:53

如果我没有在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\nStack trace:\n#0 /var/www/test.php(7): foo()\n#1 {main}\n 在 /var/www/test 中抛出.php在第 4 行

有时我想捕获异常,但仍然记录该详细信息。我正在想象这样的事情:

<?php

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

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

?>

where 将以与未捕获的异常自动写入的格式基本相同的格式写入错误日志 - 除了具有而不是 .log_exceptionCaught exceptionPHP Fatal error: Uncaught exception

是否有内置函数来记录此类异常信息,或将其捕获到字符串中?我正在想象一些与Python相似的东西。traceback.format_exc()


答案 1
error_log($e);

做你想做的事。它记录的内容与如果您没有捕获异常时记录的内容完全相同,但缺少开头的单词“Uncaught”。它之所以这样做,是因为这就是 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!");
});

答案 2

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

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


推荐