Глава 9: Обработка ошибок

9.1 Модель обработки ошибок

Обработка ошибок в DTP следует трёхфазной модели «Обнаружение-Уведомление-Восстановление»:

  1. Обнаружение: выявление аномальных условий
  2. Уведомление: отправка информации об ошибке удалённой стороне или верхнему уровню
  3. Восстановление: принятие мер по восстановлению в зависимости от типа ошибки

9.2 Система кодов ошибок

DTP определяет уникальный код ошибки для каждого типа ошибки, разделённый на восемь диапазонов по функциональным модулям:

Категория ошибкиДиапазон кодовСтратегия обработки
Ошибки обработки фреймов1xxxОтбросить фрейм + уведомить отправителя + записать в лог
Ошибки шифрования2xxxОтбросить фрейм + уведомить отправителя + возможен запуск повторного согласования ключей
Ошибки соглашений3xxxОтбросить Fragment + уведомить отправителя + возможен запуск повторных переговоров
Ошибки DAG4xxxОтклонить Fragment + уведомить отправителя, или кэшировать и ждать
Ошибки сессии5xxxПопытка восстановления сессии + при неудаче закрыть и уведомить верхний уровень
Ошибки возобновления6xxxПриостановить отправку + уведомить приложение верхнего уровня
Ошибки версий7xxxОтправить уведомление о несовместимости версий + попытка понижения версии
Ошибки прав доступа8xxxОтклонить операцию + уведомить запрашивающего

9.3 Справочник кодов ошибок

Ошибки обработки фреймов (1xxx)

Код ошибкиНазваниеОписание
1001FRAME_DESERIALIZATION_FAILEDСбой десериализации фрейма
1002FRAME_INVALID_FORMATНедопустимый формат фрейма

Ошибки шифрования (2xxx)

Код ошибкиНазваниеОписание
2001DECRYPTION_FAILEDСбой дешифрования Payload
2002KEY_NOT_READYКлюч не готов (CAP не завершён)

Ошибки соглашений (3xxx)

Код ошибкиНазваниеОписание
3001AGREEMENT_NOT_FOUNDСоглашение не найдено
3002AGREEMENT_EXPIREDСоглашение истекло
3003AGREEMENT_NEGOTIATION_FAILEDСбой переговоров по соглашению

Ошибки DAG (4xxx)

Код ошибкиНазваниеОписание
4001DAG_CYCLE_DETECTEDОбнаружен цикл в DAG
4002DAG_DEPENDENCY_UNRESOLVEDНеразрешённая зависимость DAG

Ошибки сессии (5xxx)

Код ошибкиНазваниеОписание
5001SESSION_NOT_FOUNDСессия не найдена
5002SESSION_TIMEOUTТайм-аут сессии
5003SESSION_RESTORE_FAILEDСбой восстановления сессии

Ошибки возобновления (6xxx)

Код ошибкиНазваниеОписание
6001BUFFER_FULLБуфер переполнен
6002RETRANSMISSION_TIMEOUTТайм-аут повторной передачи

Ошибки версий (7xxx)

Код ошибкиНазваниеОписание
7001VERSION_INCOMPATIBLEНесовместимость версий

Ошибки прав доступа (8xxx)

Код ошибкиНазваниеОписание
8001PERMISSION_DENIEDДоступ запрещён
8002OBSERVER_WRITE_DENIEDОперация записи Observer запрещена

9.4 Механизм уведомления об ошибках

Уведомления об ошибках передаются через Control Frame и содержат следующую информацию:

ПолеОписание
errorCodeКод ошибки
errorMessageОписательное сообщение об ошибке
relatedFrameIdID фрейма, вызвавшего ошибку (необязательно)
relatedAgreementIdСвязанный Agreement ID (необязательно)
detailsДополнительные подробности (необязательно)

9.5 Ключевые сценарии ошибок

Сбой десериализации

Когда полученный LogicalFrame не может быть корректно десериализован:

  1. Отбросить фрейм
  2. Отправить отправителю уведомление об ошибке FRAME_DESERIALIZATION_FAILED (1001)

Сбой дешифрования

Когда payload полученного LogicalFrame не может быть корректно дешифрован:

  1. Отбросить фрейм
  2. Отправить отправителю уведомление об ошибке DECRYPTION_FAILED (2001)
  3. Если количество последовательных сбоев превышает порог, запустить повторное согласование ключей CAP

Обнаружение цикла DAG

Когда объявленные зависимости Fragment формируют цикл в DAG:

  1. Отклонить Fragment
  2. Вернуть ошибку DAG_CYCLE_DETECTED (4001)

Неизвестное соглашение

Когда Fragment ссылается на Agreement_ID, не существующий у получателя:

  1. Отбросить Fragment
  2. Вернуть ошибку AGREEMENT_NOT_FOUND (3001)

Ключ не готов

Когда предпринимается попытка отправить данные, но обмен ключами CAP ещё не завершён:

  1. Отказать в отправке
  2. Вернуть ошибку KEY_NOT_READY (2002) вызывающему верхнего уровня

Буфер переполнен

Когда кэш неподтверждённых Fragment отправителя достигает предела ёмкости:

  1. Приостановить отправку новых Fragment
  2. Отправить уведомление BUFFER_FULL (6001) приложению верхнего уровня

Нарушение привилегий Observer

Когда Observer пытается инициировать запрос или изменить соглашение:

  1. Отклонить операцию
  2. Вернуть ошибку OBSERVER_WRITE_DENIED (8002)