При взаимодействии в распределенной среде разработчики часто используют типы ошибок, привязанные к языку программирования или придумывают цифровые коды ошибок, как например в HTTP 1xx, 2xx, и т.д.
На моей практике удобно использовать семантические коды ошибок + описание деталей ошибки. Большинство ошибок в распределённой среде сводятся к следующим семантическим категориям ответов:
| Категория ответа | Семантика | Повторный вызов | Метод исправления |
|---|---|---|---|
"success" |
Запрос успешно выполнен. |
Нет |
Нет |
"incorrect" |
Запрос содержит неверные параметры или данные запроса. |
Нет |
Необходимо устранить ошибки в параметрах запроса или данных на стороне отправителя. |
"unsupported" |
Запрос содержит неподдерживаемый метод, протокол или версию API на стороне получателя. |
Нет |
Отправителю необходимо устранить ошибки в запросе. Например, уточнить версию API или имя метода или использовать правильный протокол. |
"unauthorized" |
Запрос отклонён, т.к. отправитель не предоставил получателю сведения о правах доступа. Например: не предоставлен токен доступа, анонимная или устаревшая сессия при вызове. |
Нет |
Отправителю необходимо создать сессию или представить данные для авторизации (например токен), или совершить предварительные действия для предоставления получателю сведений о правах доступа отправителя. |
"forbidden" |
Запрос отклонён, т.к. отправителю явно запрещено выполнение данного запроса (нет прав). |
Нет |
Отправителю необходимо получить права доступа на выполнение данного запроса или предоставить другие данные для авторизации. |
"unavailable" |
Получатель сейчас недоступен и не может обработать запрос. |
Да |
Отправителю необходимо убедиться, что получатель работает нормально (если это возможно) и повторить запрос позднее. |
"not found" |
Запрашиваемые данные отправителем не найдены у получателя. |
Нет |
Отправителю необходимо уточнить параметры запроса. Например, уточнить идентификатор запрашиваемой сущности или изменить условия запроса. |
"conflict" |
Запрос содержит конфликтующие данные, которые не могут быть приняты получателем. |
Нет |
Отправителю необходимо синхронизировать конфликтные данные с получателем. Например, уточнить версию сущности данных в БД, исправить метку времени, проверить существование записи данных и т.д. |
"busy" |
Запрос не может быть обработан в данный момент, т.к. не хватает ресурсов у получателя или он загружен другой работой. |
Да |
Отправителю необходимо повторить запрос позднее. |
"error" |
Общая ошибка при выполнении запроса. Запрос содержит испорченные данные, которые не могут быть прочитаны получателем или ошибка в канале связи. |
Нет |
Отправителю необходимо устранить ошибки в запросе или проверить канал связи до получателя. |
"interrupted" |
Запрос прерван на стороне отправителя. |
Да |
Отправитель может послать запрос заново. |