コンテンツにスキップ

エラー処理

エラー処理は、信頼性が高くユーザーフレンドリーなOpen APIアプリケーションの重要な部分です。 さまざまなエラーをキャッチして処理しない限り、ユーザーは欠陥のあるUIを経験したり、特定の重要なアクションを完全に実行できなくなる可能性があります。

大まかに言えば、エラーが発生する層に応じて異なるエラー処理プロセスが実装される場合があります。

  • データ層とドメイン層で。 場合によっては、cTraderバックエンドがProtoErrorResメッセージをリクエストの1つに対する応答として送信することがあります。 注文、取引、またはポジションに関連する操作では、ProtoOAOrderErrorEventメッセージを受け取ることもあります。
  • ドメイン層とアプリケーション層で。 ユーザーは、コードで考慮されていないアクションを実行する可能性があり、その結果、アプリケーションが予期せずに動作することがあります。

これらのレベルでのエラー処理のメカニズムは異なり、以下に説明されています。

データ層とドメイン層でのエラー処理

以下の状況でProtoErrorResまたはProtoOAOrderErrorEventを受け取ることがあります(リストは完全ではありません):

  • 市場が閉じているシンボルに注文を出そうとする。
  • 不正またはサポートされていないメッセージを送信する。
  • 実行中の注文を変更しようとする。
  • cTraderバックエンドへの接続を失った後にメッセージを送信する。

エラーを分析する

ProtoErrorResProtoOAOrderErrorEventの両方には、発生したエラーの種類とその説明を含むerrorCodedescriptionフィールドがあります。 サポートされているすべてのエラーコードの完全なリストは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との統合方法に関係なく、以下の推奨事項が役立つ場合があります。

  • 主要なUI要素に対して専用のエラー状態を常に実装します。 これにより、アプリケーションが完全に壊れるのを防ぎ、半減退状態で実行できるようになります。
  • エラーを適切な場所(例えば、ローカルストレージ)に記録する、安全で信頼性の高いログ記録メカニズムを実装します。 繰り返しエラーが発生した場合、ログ記録によりその原因を特定し、対処することが容易になります。
  • ユーザーがエラーを報告するためのメカニズムを作成します。 これは、アプリケーション内に連絡先情報を提供するだけの簡単なものから、新しいエラーが発生したときにトリガーされる自動フィードバック送信サービスを追加する複雑なものまでさまざまです。
  • エラー発生時に使用されるリソースが適切にクリーンアップされるようにします。 ほとんどの言語はガベージコレクタサービスを提供していますが、カスタムリソース廃棄ロジックを指定することもできます。