Перейти к содержанию

Обработка ошибок

Обработка ошибок является важнейшей частью любого надежного и удобного для пользователя приложения Open API. Если вы не перехватываете и не обрабатываете различные ошибки, ваши пользователи могут столкнуться с неправильным пользовательским интерфейсом или вообще не смогут выполнять определенные важные действия.

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

  • На уровне данных и предметной области. В некоторых случаях бэкенд cTrader может отправить сообщение ProtoErrorRes в ответ на один из ваших запросов. Для операций, связанных с ордерами, сделками или позициями, вы также можете получить сообщение ProtoOAOrderErrorEvent.
  • На уровне предметной области и приложения. Пользователи могут выполнять действия, которые вы не учли в своем коде, в результате чего ваше приложение будет вести себя неожиданно.

Механизмы обработки ошибок на этих уровнях различаются и описаны ниже.

Обработка ошибок на уровне данных и домена

Вы можете получить ProtoErrorRes или ProtoOAOrderErrorEvent в следующих ситуациях (обратите внимание, что список не является исчерпывающим):

  • Попытка разместить ордер для символа, рынок которого закрыт.
  • Отправка неправильного или неподдерживаемого сообщения.
  • Попытка изменить ордер, который выполняется.
  • Отправка сообщения после потери соединения с бэкендом cTrader.

Анализ ошибок

И ProtoErrorRes, и ProtoOAOrderErrorEvent имеют поля errorCode и description, которые содержат точную информацию о типе произошедшей ошибки и ее описание. Вы можете увидеть полный список всех поддерживаемых кодов ошибок в перечислении ProtoErrorCode.

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

Работа с JSON

При работе с JSON вы все еще можете повторно использовать код из этого руководства; однако вам потребуется немного изменить его в зависимости от вашего подхода к сериализации и десериализации, а также предпочитаемого TCP- и WebSocket-клиента.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
private void SubscribeToErrors(IObservable<IMessage> observable)
{
    if (observable is null) throw new ArgumentNullException(nameof(observable));

    observable.ObserveOn(SynchronizationContext.Current).Subscribe(_ => { }, OnError);
    observable.OfType<ProtoErrorRes>().ObserveOn(SynchronizationContext.Current).Subscribe(OnErrorRes);

    observable.OfType<ProtoOAOrderErrorEvent>().ObserveOn(SynchronizationContext.Current).Subscribe(OnOrderErrorRes);
}

private void OnOrderErrorRes(ProtoOAErrorRes error)
{
    Console.WriteLine($"Error: Error {error.ErrorCode}; {error.Description}");
}

private void OnErrorRes(ProtoErrorRes error)
{
    Console.WriteLine($"Error: Error {error.ErrorCode}; {error.Description}");
}

При использовании библиотеки twisted для обработки асинхронных операций вы должны подписываться на обратный вызов ошибки каждый раз, когда отправляете новое сообщение, как показано в примере ниже для ProtoOAVersionReq.

1
2
3
4
5
6
7
8
def sendProtoOAVersionReq(clientMsgId = None):
    request = ProtoOAVersionReq()
    deferred = client.send(request, clientMsgId = clientMsgId)
    deferred.addErrback(onError)

def onError(failure):
    print("Message Error: ", failure)
    reactor.callLater(3, callable=executeUserCommand)

Обработка ошибок на уровне домена и приложения

Способ обработки ошибок на уровне домена и приложения зависит от выбранного вами языка программирования, UI-фреймворка и реализуемых вами сценариев использования, что затрудняет предоставление конкретных фрагментов кода и решений.

Однако следующие рекомендации могут оказаться полезными независимо от того, как вы решите интегрироваться с cTrader Open API.

  • Всегда реализуйте выделенное состояние ошибки для основных элементов пользовательского интерфейса. Это предотвратит полное разрушение вашего приложения и позволит ему работать в частично деградированном состоянии.
  • Реализуйте безопасный и надежный механизм логирования, который будет записывать ошибки в подходящее место (например, в локальное хранилище). Если возникают повторяющиеся ошибки, логирование должно упростить выявление и устранение их причины.
  • Создайте механизм, позволяющий пользователям сообщать вам об ошибках. Это может быть как простое предоставление вашей контактной информации в приложении, так и сложное добавление автоматического сервиса отправки отзывов, который срабатывает при новых ошибках.
  • Убедитесь, что все ресурсы, используемые при возникновении ошибок, правильно очищаются. Хотя большинство языков предлагают службы сборки мусора, вы можете захотеть указать пользовательскую логику освобождения ресурсов.