Ir para o conteúdo

Gestão de erros

A gestão de erros é uma parte crucial de qualquer aplicação Open API fiável e fácil de usar. A menos que detete e processe vários erros, os seus utilizadores podem experienciar uma interface do utilizador defeituosa ou podem ser impedidos de realizar certas ações essenciais por completo.

Em termos gerais, diferentes processos de gestão de erros podem ser implementados dependendo da camada onde ocorre um erro.

  • Na camada de dados e domínio. Em alguns casos, o backend do cTrader pode enviar a mensagem ProtoErrorRes como resposta a um dos seus pedidos. Para operações relacionadas com ordens, negócios ou posições, também pode receber a mensagem ProtoOAOrderErrorEvent.
  • Na camada de domínio e aplicação. Os utilizadores podem realizar ações que não previu no seu código, resultando num comportamento inesperado da sua aplicação.

Os mecanismos para gerir erros nestes níveis diferem e são descritos abaixo.

Gestão de erros na camada de dados e domínio

Pode receber ProtoErrorRes ou ProtoOAOrderErrorEvent nas seguintes situações (note que a lista não é exaustiva):

  • Tentar colocar uma ordem para um símbolo cujo mercado está fechado.
  • Enviar uma mensagem incorreta ou não suportada.
  • Tentar modificar uma ordem que está em execução.
  • Enviar uma mensagem após perder a ligação ao backend do cTrader.

Analisar erros

Tanto o ProtoErrorRes como o ProtoOAOrderErrorEvent têm os campos errorCode e description que contêm informações precisas sobre o tipo de erro que ocorreu e a sua descrição. Pode ver a lista completa de todos os códigos de erro suportados em o enum ProtoErrorCode.

Para garantir que a sua aplicação não falha nestes casos, pode geralmente subscrever callbacks que são acionados quando recebe uma resposta de erro. A lógica exata destes callbacks, bem como a forma como pode subscrevê-los, depende do cliente que está a utilizar para estabelecer uma ligação e escutar o fluxo de mensagens.

Trabalhar com JSON

Ao operar com JSON, pode ainda reutilizar código deste tutorial; no entanto, precisará de o modificar ligeiramente dependendo da sua abordagem à serialização e desserialização e do seu cliente TCP e WebSocket preferido.

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

Ao utilizar a biblioteca twisted para gerir operações assíncronas, tem de subscrever um callback de erro sempre que enviar uma nova mensagem, como mostrado no exemplo abaixo para 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)

Gestão de erros na camada de domínio e aplicação

A forma como gere os erros nas camadas de domínio e aplicação depende da linguagem de programação escolhida, do framework de UI e dos casos de uso que implementa, tornando difícil fornecer snippets de código e soluções específicas.

No entanto, as seguintes recomendações podem ser úteis independentemente de como escolhe integrar com a Open API do cTrader.

  • Implemente sempre um estado de erro dedicado para elementos principais da UI. Isto evitará que a sua aplicação falhe completamente e permitirá que funcione num estado semi-degradado.
  • Implemente um mecanismo de registo seguro e fiável que registará erros numa localização adequada (por exemplo, armazenamento local). Se ocorrerem erros repetidos, o registo deve simplificar a identificação e resolução da sua causa.
  • Crie um mecanismo para os utilizadores o informarem sobre erros. Isto pode ser tão simples como fornecer as suas informações de contacto dentro da aplicação ou tão complexo como adicionar um serviço automático de envio de feedback que é acionado com novos erros.
  • Certifique-se de que quaisquer recursos utilizados quando ocorrem erros são devidamente limpos. Embora a maioria das linguagens ofereça serviços de recolha de lixo, pode querer especificar uma lógica personalizada de eliminação de recursos.