Структурирование исключений. Что вы указываете в качестве exeption code? К своему стыду не так давно понял, что работа с exception'ами очень ёмкая и довольно сложная тема, которая выходит далеко за пределы простого try .. catch, и которая при правильном подходе позволяет значительно упростить написание кода, тестов, логирования и устранение ошибок.
Я переопределил классы всех базовых и SPL исключений в PHP чтобы иметь возможность отделять ошибки своего приложения, от ошибок сторонних библиотек. Создал классы своих, часто используемых общих исключений вида NegativeValueException, OutOfEnumException и подобных, которые в коде используются много где. Создал классы важных, специфичных исключений, типа InvalidProjectNameException которые в коде используется только в одном месте. Т.е. со структурой вроде как порядок, и я могу легко отличать одну ошибку от другой. Но остался 1 вопрос: что писать в exception code когда я выбрасываю исключение? Мне не удалось найти каких-либо best practices по этому вопросу. Я знаю несколько возможных сценариев, но мне кажется что все они костыльны1. Коды состояния http
В ряде случаев отдавать коды 403, 404 и т.д. вполне уместно. Но этот метод актуален скорее для работы с чем-то "внешним". Т.е. если мы говорим о бэкенде веб-приложения, то уместно будет отдавать скажем ошибку 500 наружу для фронтенда в случае каких-то внутренних ошибок сервера, но разброс таких ошибок может быть очень велик. Контроллер может отдать ошибку 500 обрабатывая исключения, выброшенные сервисным слоем, моделью или репозиторием. Т.е. под этот внешний код может попадать множество "внутренних" исключений. Эти внтуренние исключения само-собой будут залогированы, но когда к тебе обращается клиент с жалобой типа "у меня тут ошибка 500 выскочила", то то искать причину нужно в логах, отфильтровывая ее по множеству параметров. Выводить наружу текст ошибки конкретного исключения я считаю плохой практикой 2. Вести справочник кодов.
Можно попробовать вести нечто вроде документации, каждому классу исключения принудительно задавать свой код. Или даже для каждого конкретного случая выбрасывания исключения задавать свой код. Этот код можно выбрасывать наружу, отображая его пользователю. В таком случае идентифицировать ошибку со слов клиента будет очень легко, но ведение подобного справочника превратиться в ад, в котором будет легко запутаться. Либо я просто не знаю правильных методов это делать3. Коды нужны только для того, чтобы отличить ситуацию, в которой выбрасывается одно и то же исключение.
Например, у меня есть метод, который принимает в качестве аргументов 2 email адреса. Каждый из них валидируется, и в случае ошибки выбрасывается InvalidEmailException. Т.е. один метод класса в разных местах может выбросить одно и то же исключение. Это не удобно тестировать, и с целью упрощения тестирования при выбрасывании исключения мы можем каждому в качестве кода задать номер, и в тестах отличать исключение выброшенное от проверки 1 и 2 email'ов. Это единственное нормальное применение кодов которое я вижу в настоящий момент4. Записывать в код исключения ID пользователя
Про это я где-то читал, по-моему даже на хабре. Но считаю это ужасной практикой. ID пользователя можно вытащить далеко не всегда и не везде (если конечно соблюдать принципы SOLID). Да и эту задачу должен решать логгер, а не коды исключений
Поделитесь пожалуйста опытом, как вы обрабатываете исключения и что указываете в кодах?UPD: вопрос не про логирование и поиск конкретной ошибки в логах. С этим у меня успешно справляется sentry. Я спрашиваю про то, как кто использует коды в исключениях, и я лишь привел примеры того, как их можно юзать с их плюсами и минусами

21 Авг 2019 в 06:26
194 +1
0
Ответы
1

Я обычно использую коды исключений для отличия разных типов ошибок, чтобы потом можно было корректно обработать их в коде. Например, для всех исключений связанных с внешним API я могу использовать один диапазон кодов, а для ошибок базы данных - другой. Это помогает легче определять причину ошибки и принимать соответствующие решения.

Также я стараюсь использовать коды исключений для определения действий при их возникновении. Например, если у меня есть исключение связанное с отсутствием файла, то я могу использовать определенный код исключения, чтобы дополнительно проверить наличие файла или создать его при необходимости.

В случае с пользовательскими ошибками я также использую специфические коды исключений, чтобы можно было показать пользователю понятное сообщение об ошибке. Например, если пароль введен неправильно, то я могу использовать определенный код исключения, чтобы показать пользователю сообщение о неправильном пароле.

В общем, использование кодов исключений помогает мне лучше структурировать и обрабатывать ошибки в моем коде.

20 Апр в 13:18
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 94 835 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир