Если я не поймаю исключение в 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 Неустранимая ошибка: Не удалось исключить «Исключение» с сообщением «О нет!» в /var/www/test.php:4\nStack trace: \ n # 0 /var/www/test.php(7): foo () \ n # 1 {main} \ n выбрано in / 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.
error_log($e);
делает то, что вы хотите. Он регистрирует то же самое, что и в журнале, если вы не поймали исключение, за исключением слова «Нечистить» в начале. Он делает это, потому что это возвращает магический метод класса __toString()
класса Exception
.
Вы можете сделать это в блоке catch
:
try { foo(); } catch (Exception $e) { error_log("Caught $e"); }
Или в обработчике исключений:
set_exception_handler(function($exception) { error_log($exception); error_page("Something went wrong!"); });
Вы можете использовать методы из класса Exception
класса PHP .
Используйте getMessage
чтобы получить сообщение Oh no!
и используйте getTraceAsString
для получения отформатированной трассы.
Вы можете использовать http://php.net/manual/en/function.set-exception-handler.php для регистрации функции обратного вызова, которая получит сообщение от $ e-> getMessage (); и сбрасывать его в файл.