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

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