Подтвердить что ты не робот

Исключение журнала с трассировкой стека

Если я не поймаю исключение в PHP, я получаю сообщение об ошибке в моем error.log файле с трассировкой стека. Например, если я запустил:

<?php

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

  foo();

?>

то я получаю это в моих журналах:

[Wed Mar 06 10:35:32 2013] [error] [клиент 86.146.145.175] PHP Fatal error: Неотключить исключение "Исключение" с сообщением "О нет!". в /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);
  }

?>

где log_exception будет записывать в журнал ошибок что-то в основном в том же формате, что и то, что автоматически записывается для неперехваченного исключения - возможно, буквально идентично, кроме Caught exception вместо PHP Fatal error: Uncaught exception.

Есть ли встроенная функция для регистрации информации об исключении, подобной этой, или для ее записи в строку? Я представляю себе что-то похожее на traceback.format_exc() в Python.

4b9b3361

Ответ 1

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!");
});

Ответ 2

Вы можете использовать методы из PHP base Exception class.

Используйте getMessage для получения сообщения Oh no! и используйте getTraceAsString для получения отформатированной трассы.

Ответ 3

Вы можете использовать http://php.net/manual/en/function.set-exception-handler.php, чтобы зарегистрировать функцию обратного вызова, которая получит сообщение от $e- > getMessage(); и выгрузите его в файл.