Я нахожусь в процессе рефакторинга довольно большого веб-приложения. Одна из главных проблем - непоследовательная обработка ошибок, и я пытаюсь придумать разумную стратегию. Я создал собственный обработчик ошибок с помощью set_error_handler, который по существу превращает ошибки PHP в ErrorExceptions и пользовательский базовый класс исключений, который напрямую наследуется от Exception .
На производстве я использую универсальную ловушку исключений через set_exception_handler , и я собираюсь добавить регистрацию исключений * в смесь. Моя дилемма заключается в том, где вести реальную регистрацию, в базовом классе исключений или во всеобъемлющем.
Я подумал о нескольких причинах, чтобы войти в это в ловушку:
- В коде довольно много исключений, которые необходимо преобразовать в некоторого подходящего потомка базового класса исключений. Пока это не произойдет, не все исключения будут зарегистрированы.
- Каким-то образом кажется более естественным делать это во всеобщем порядке, базовый класс исключений не должен делать больше, чем просто это. (Это может быть одна вещь принципа ответственности, но это может быть просто ошибочное чувство)
и одна из причин входа в базовый класс исключений:
- В настоящее время универсальное оборудование используется только на производстве. Было бы легко представить его в других наших средах (разработка, тестирование), но для этого потребовалось бы внести несколько корректировок, поскольку ошибки обрабатываются по-разному для каждой среды, так как на производстве они переводятся на страницы ошибок 404/503.
Есть ли приемлемая практика для регистрации исключений?
* Вначале ведение журнала будет включать запись в текстовый файл, и оно может эволюционировать в отправку писем для определенных типов исключений.
Некоторые пояснения, побуждаемые @ unholysampler в ответ :
Я сталкиваюсь с 2 * 10 ^ 6 sloc кодовой базой, со множеством сторонних материалов, которые я не могу контролировать, и часть кода, который у меня есть, контролирует исключения предшествующих дат в PHP. И есть еще какой-то дерьмовый недавний код, мы выздоравливаем после длительного периода интенсивного давления, когда нам практически пришлось перестать думать и просто взломать.
Мы активно проводим рефакторинг, чтобы устранить все несоответствия и внедрить разумный подход к обработке ошибок, но это займет некоторое время. Меня больше интересует, что делать, пока я не достигну точки, где ошибки обрабатываются надлежащим образом. Возможно, я когда-нибудь задам другой вопрос о разумной стратегии исключения.
Основной мотивацией для ведения журнала является получение электронного письма на мой телефон всякий раз, когда на производстве происходит что-то плохое. Мне все равно, будут ли огромные дампы данных, если они будут, у меня будет работа cron, которая время от времени удаляет старые.
источник
Если ваш язык / среда выполнения не позволяют вам легко определить источник исключения, есть случай, чтобы записать его в очередь. C ++ и некоторые движки JS не предоставляют файл + строка или стек вызовов исключения к тому времени, когда вы его поймали / но эта информация доступна на момент создания исключения.
Нашим решением было предоставить механизм, который использовал бы конфигурацию во время выполнения, чтобы включить регистрацию типа исключения вместе с дешевым стеком при попытке диагностировать эти проблемы.
источник