Vai al contenuto

Gestione degli errori

La gestione degli errori è una parte cruciale di qualsiasi applicazione Open API affidabile e user-friendly. A meno che tu non catturi e elabori vari errori, i tuoi utenti potrebbero sperimentare un'interfaccia utente difettosa o potrebbero essere completamente impediti dall'eseguire alcune azioni essenziali.

In generale, possono essere implementati diversi processi di gestione degli errori a seconda del livello in cui si verifica un errore.

  • A livello di dati e dominio. In alcuni casi, il backend di cTrader potrebbe inviare il messaggio ProtoErrorRes come risposta a una delle tue richieste. Per le operazioni relative a ordini, operazioni o posizioni, potresti anche ricevere il messaggio ProtoOAOrderErrorEvent.
  • A livello di dominio e applicazione. Gli utenti potrebbero eseguire azioni che non hai previsto nel tuo codice, causando un comportamento imprevisto della tua applicazione.

I meccanismi per gestire gli errori a questi livelli differiscono e sono descritti di seguito.

Gestione degli errori a livello di dati e dominio

Potresti ricevere ProtoErrorRes o ProtoOAOrderErrorEvent nelle seguenti situazioni (nota che l'elenco non è esaustivo):

  • Tentativo di piazzare un ordine per un simbolo per cui il mercato è chiuso.
  • Invio di un messaggio errato o non supportato.
  • Tentativo di modificare un ordine in fase di esecuzione.
  • Invio di un messaggio dopo aver perso la connessione al backend di cTrader.

Analizza gli errori

Sia ProtoErrorRes che ProtoOAOrderErrorEvent hanno i campi errorCode e description che contengono informazioni precise sul tipo di errore verificatosi e la sua descrizione. Puoi vedere l'elenco completo di tutti i codici di errore supportati in l'enum ProtoErrorCode.

Per assicurarti che la tua applicazione non si blocchi in tali casi, di solito puoi sottoscrivere callback che si attivano quando ricevi una risposta di errore. La logica esatta di questi callback e il modo in cui puoi sottoscriverli dipendono dal client che stai utilizzando per stabilire una connessione e ascoltare il flusso di messaggi.

Lavorare con JSON

Quando si lavora con JSON, è comunque possibile riutilizzare il codice di questo tutorial; tuttavia, sarebbe necessario modificarlo leggermente a seconda dell'approccio alla serializzazione e deserializzazione e del client TCP e WebSocket preferito.

 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}");
}

Quando si utilizza la libreria twisted per gestire operazioni asincrone, è necessario sottoscrivere un callback di errore ogni volta che si invia un nuovo messaggio, come mostrato nell'esempio seguente per 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)

Gestione degli errori a livello di dominio e applicazione

Il modo in cui gestisci gli errori a livello di dominio e applicazione dipende dal linguaggio di programmazione scelto, dal framework UI e dai casi d'uso implementati, rendendo difficile fornire snippet di codice e soluzioni specifiche.

Tuttavia, le seguenti raccomandazioni possono rivelarsi utili indipendentemente da come scegli di integrare cTrader Open API.

  • Implementa sempre uno stato di errore dedicato per gli elementi principali dell'interfaccia utente. Ciò impedirà alla tua applicazione di bloccarsi completamente e consentirà di funzionare in uno stato semi-degradato.
  • Implementa un meccanismo di registrazione sicuro e affidabile che registrerà gli errori in una posizione adeguata (ad esempio, l'archiviazione locale). Se si verificano errori ripetuti, la registrazione dovrebbe semplificare l'identificazione e la risoluzione della loro causa.
  • Crea un meccanismo per consentire agli utenti di informarti degli errori. Può essere semplice come fornire le tue informazioni di contatto all'interno dell'applicazione o complesso come aggiungere un servizio di invio automatico di feedback che si attiva in caso di nuovi errori.
  • Assicurati che tutte le risorse utilizzate quando si verificano errori vengano correttamente liberate. Sebbene la maggior parte dei linguaggi offra servizi di garbage collector, potresti voler specificare una logica personalizzata di smaltimento delle risorse.