Исключение журнала с трассировкой стека
Если я не поймаю исключение в 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.
Ответы
Ответ 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(); и выгрузите его в файл.