Przejdź do treści

Obsługa błędów

Obsługa błędów jest kluczowym elementem każdej niezawodnej i przyjaznej dla użytkownika aplikacji Open API. Jeśli nie przechwycisz i nie przetworzysz różnych błędów, Twoi użytkownicy mogą doświadczyć wadliwego interfejsu użytkownika lub mogą być całkowicie uniemożliwieni w wykonywaniu pewnych podstawowych działań.

Ogólnie rzecz biorąc, różne procesy obsługi błędów mogą być implementowane w zależności od warstwy, w której występuje błąd.

  • W warstwie danych i domeny. W niektórych przypadkach backend cTradera może wysłać komunikat ProtoErrorRes jako odpowiedź na jedno z Twoich żądań. W przypadku operacji związanych ze zleceniami, transakcjami lub pozycjami możesz również otrzymać komunikat ProtoOAOrderErrorEvent.
  • W warstwie domeny i aplikacji. Użytkownicy mogą wykonywać działania, których nie uwzględniłeś w swoim kodzie, co skutkuje nieoczekiwanym zachowaniem Twojej aplikacji.

Mechanizmy obsługi błędów na tych poziomach różnią się i są opisane poniżej.

Obsługa błędów w warstwie danych i domeny

Możesz otrzymać ProtoErrorRes lub ProtoOAOrderErrorEvent w następujących sytuacjach (należy pamiętać, że lista nie jest wyczerpująca):

  • Próba złożenia zlecenia dla symbolu, dla którego rynek jest zamknięty.
  • Wysłanie nieprawidłowej lub nieobsługiwanej wiadomości.
  • Próba modyfikacji zlecenia, które jest w trakcie realizacji.
  • Wysłanie wiadomości po utracie połączenia z backendem cTrader.

Analizuj błędy

Zarówno ProtoErrorRes, jak i ProtoOAOrderErrorEvent mają pola errorCode i description, które zawierają dokładne informacje o typie błędu, który wystąpił, oraz jego opis. Pełną listę wszystkich obsługiwanych kodów błędów można znaleźć w wyliczeniu ProtoErrorCode.

Aby upewnić się, że Twoja aplikacja nie ulegnie awarii w takich przypadkach, zazwyczaj możesz zasubskrybować wywołania zwrotne, które są wyzwalane po otrzymaniu odpowiedzi błędu. Dokładna logika tych wywołań zwrotnych, a także sposób ich subskrypcji zależą od klienta, którego używasz do nawiązania połączenia i nasłuchiwania strumienia wiadomości.

Praca z JSON

Podczas pracy z JSON nadal możesz ponownie wykorzystać kod z tego samouczka; jednak będziesz musiał nieznacznie go zmodyfikować w zależności od podejścia do serializacji i deserializacji oraz preferowanego klienta TCP i 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}");
}

Podczas korzystania z biblioteki twisted do obsługi operacji asynchronicznych musisz zasubskrybować wywołanie zwrotne błędu za każdym razem, gdy wysyłasz nową wiadomość, jak pokazano w poniższym przykładzie dla 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)

Obsługa błędów w warstwie domeny i aplikacji

Sposób obsługi błędów w warstwach domeny i aplikacji zależy od wybranego języka programowania, frameworka UI oraz implementowanych przypadków użycia, co utrudnia dostarczenie konkretnych fragmentów kodu i rozwiązań.

Jednak poniższe zalecenia mogą okazać się przydatne niezależnie od tego, w jaki sposób zdecydujesz się zintegrować z cTrader Open API.

  • Zawsze implementuj dedykowany stan błędu dla głównych elementów UI. Zapobiegnie to całkowitej awarii aplikacji i umożliwi działanie w stanie częściowo zdegradowanym.
  • Zaimplementuj bezpieczny i niezawodny mechanizm logowania, który będzie rejestrował błędy w odpowiedniej lokalizacji (na przykład w pamięci lokalnej). W przypadku powtarzających się błędów logowanie powinno uprościć identyfikację i rozwiązanie ich przyczyny.
  • Stwórz mechanizm umożliwiający użytkownikom informowanie Cię o błędach. Może to być tak proste, jak podanie informacji kontaktowych w aplikacji, lub tak skomplikowane, jak dodanie automatycznej usługi przesyłania opinii, która uruchamia się przy nowych błędach.
  • Upewnij się, że wszelkie zasoby używane w momencie wystąpienia błędów są odpowiednio czyszczone. Chociaż większość języków oferuje usługi garbage collectora, możesz chcieć określić niestandardową logikę usuwania zasobów.