Глава 9: Обработка ошибок
9.1 Модель обработки ошибок
Обработка ошибок в DTP следует трёхфазной модели «Обнаружение-Уведомление-Восстановление»:
- Обнаружение: выявление аномальных условий
- Уведомление: отправка информации об ошибке удалённой стороне или верхнему уровню
- Восстановление: принятие мер по восстановлению в зависимости от типа ошибки
9.2 Система кодов ошибок
DTP определяет уникальный код ошибки для каждого типа ошибки, разделённый на восемь диапазонов по функциональным модулям:
| Категория ошибки | Диапазон кодов | Стратегия обработки |
|---|---|---|
| Ошибки обработки фреймов | 1xxx | Отбросить фрейм + уведомить отправителя + записать в лог |
| Ошибки шифрования | 2xxx | Отбросить фрейм + уведомить отправителя + возможен запуск повторного согласования ключей |
| Ошибки соглашений | 3xxx | Отбросить Fragment + уведомить отправителя + возможен запуск повторных переговоров |
| Ошибки DAG | 4xxx | Отклонить Fragment + уведомить отправителя, или кэшировать и ждать |
| Ошибки сессии | 5xxx | Попытка восстановления сессии + при неудаче закрыть и уведомить верхний уровень |
| Ошибки возобновления | 6xxx | Приостановить отправку + уведомить приложение верхнего уровня |
| Ошибки версий | 7xxx | Отправить уведомление о несовместимости версий + попытка понижения версии |
| Ошибки прав доступа | 8xxx | Отклонить операцию + уведомить запрашивающего |
9.3 Справочник кодов ошибок
Ошибки обработки фреймов (1xxx)
| Код ошибки | Название | Описание |
|---|---|---|
| 1001 | FRAME_DESERIALIZATION_FAILED | Сбой десериализации фрейма |
| 1002 | FRAME_INVALID_FORMAT | Недопустимый формат фрейма |
Ошибки шифрования (2xxx)
| Код ошибки | Название | Описание |
|---|---|---|
| 2001 | DECRYPTION_FAILED | Сбой дешифрования Payload |
| 2002 | KEY_NOT_READY | Ключ не готов (CAP не завершён) |
Ошибки соглашений (3xxx)
| Код ошибки | Название | Описание |
|---|---|---|
| 3001 | AGREEMENT_NOT_FOUND | Соглашение не найдено |
| 3002 | AGREEMENT_EXPIRED | Соглашение истекло |
| 3003 | AGREEMENT_NEGOTIATION_FAILED | Сбой переговоров по соглашению |
Ошибки DAG (4xxx)
| Код ошибки | Название | Описание |
|---|---|---|
| 4001 | DAG_CYCLE_DETECTED | Обнаружен цикл в DAG |
| 4002 | DAG_DEPENDENCY_UNRESOLVED | Неразрешённая зависимость DAG |
Ошибки сессии (5xxx)
| Код ошибки | Название | Описание |
|---|---|---|
| 5001 | SESSION_NOT_FOUND | Сессия не найдена |
| 5002 | SESSION_TIMEOUT | Тайм-аут сессии |
| 5003 | SESSION_RESTORE_FAILED | Сбой восстановления сессии |
Ошибки возобновления (6xxx)
| Код ошибки | Название | Описание |
|---|---|---|
| 6001 | BUFFER_FULL | Буфер переполнен |
| 6002 | RETRANSMISSION_TIMEOUT | Тайм-аут повторной передачи |
Ошибки версий (7xxx)
| Код ошибки | Название | Описание |
|---|---|---|
| 7001 | VERSION_INCOMPATIBLE | Несовместимость версий |
Ошибки прав доступа (8xxx)
| Код ошибки | Название | Описание |
|---|---|---|
| 8001 | PERMISSION_DENIED | Доступ запрещён |
| 8002 | OBSERVER_WRITE_DENIED | Операция записи Observer запрещена |
9.4 Механизм уведомления об ошибках
Уведомления об ошибках передаются через Control Frame и содержат следующую информацию:
| Поле | Описание |
|---|---|
| errorCode | Код ошибки |
| errorMessage | Описательное сообщение об ошибке |
| relatedFrameId | ID фрейма, вызвавшего ошибку (необязательно) |
| relatedAgreementId | Связанный Agreement ID (необязательно) |
| details | Дополнительные подробности (необязательно) |
9.5 Ключевые сценарии ошибок
Сбой десериализации
Когда полученный LogicalFrame не может быть корректно десериализован:
- Отбросить фрейм
- Отправить отправителю уведомление об ошибке FRAME_DESERIALIZATION_FAILED (1001)
Сбой дешифрования
Когда payload полученного LogicalFrame не может быть корректно дешифрован:
- Отбросить фрейм
- Отправить отправителю уведомление об ошибке DECRYPTION_FAILED (2001)
- Если количество последовательных сбоев превышает порог, запустить повторное согласование ключей CAP
Обнаружение цикла DAG
Когда объявленные зависимости Fragment формируют цикл в DAG:
- Отклонить Fragment
- Вернуть ошибку DAG_CYCLE_DETECTED (4001)
Неизвестное соглашение
Когда Fragment ссылается на Agreement_ID, не существующий у получателя:
- Отбросить Fragment
- Вернуть ошибку AGREEMENT_NOT_FOUND (3001)
Ключ не готов
Когда предпринимается попытка отправить данные, но обмен ключами CAP ещё не завершён:
- Отказать в отправке
- Вернуть ошибку KEY_NOT_READY (2002) вызывающему верхнего уровня
Буфер переполнен
Когда кэш неподтверждённых Fragment отправителя достигает предела ёмкости:
- Приостановить отправку новых Fragment
- Отправить уведомление BUFFER_FULL (6001) приложению верхнего уровня
Нарушение привилегий Observer
Когда Observer пытается инициировать запрос или изменить соглашение:
- Отклонить операцию
- Вернуть ошибку OBSERVER_WRITE_DENIED (8002)
