エラーハンドリングは、信頼性が高くユーザーフレンドリーなOpen APIアプリケーションの重要な部分です。さまざまなエラーをキャッチして処理しないと、ユーザーは ‘janky’ なUIを経験したり、一部の重要なアクションを完全に実行できなくなる可能性があります。
大まかに言えば、エラーハンドリングプロセスは、エラーが発生するレイヤーに応じて異なる方法で実装できます。
- データ/ドメイン層で。いくつかの場合、cTraderバックエンドは、リクエストの1つに対する応答としてProtoErrorResメッセージを送信する場合があります。注文、取引、またはポジションに関連する操作の場合、ProtoOAOrderErrorEventメッセージも受け取ることがあります。
- ドメイン/アプリケーション層で。ユーザーがコードで考慮していないアクションを実行すると、アプリケーションが予期せずに振る舞う可能性があります。
これらのレベルでのエラー処理メカニズムは異なり、以下に説明します。
データ/ドメイン層でのエラーハンドリング¶
次の状況でProtoErrorRes
またはProtoOAOrderErrorEvent
を受信することがあります(リストは全てではありません)。
- 市場が閉じているシンボルに対して注文を出す試み。
- 不正確またはサポートされていないメッセージを送信する。
- 実行中の注文を変更しようとする。
- cTraderバックエンドへの接続が切断された後にメッセージを送信する。
エラーの分析
ProtoErrorRes
およびProtoOAOrderErrorEvent
には、発生したエラーの種類とその説明に関する正確な情報を含むerrorCode
およびdescription
フィールドがあります。すべてのサポートされているエラーコードの完全なリストは、ProtoErrorCode列挙型で確認できます。
これらの場合にアプリケーションが ‘壊れない’ ようにするには、通常、エラー応答を受信したときにトリガーされるコールバックに登録できます。これらのコールバックの正確なロジックや、どのようにしてそれに登録するかは、接続を確立し、メッセージストリームをリッスンするために使用しているクライアントに依存します。
JSONでの作業
JSONを使用する場合、このチュートリアルからのコードを再利用することができます。ただし、シリアル化/デシリアル化のアプローチや、好みのTCP/WebSocketクライアントに応じて、わずかに変更する必要があります。
private void SubscribeToErrors(IObservable observable)
{
if (observable is null) throw new ArgumentNullException(nameof(observable));
observable.ObserveOn(SynchronizationContext.Current).Subscribe(_ => { }, OnError);
observable.OfType().ObserveOn(SynchronizationContext.Current).Subscribe(OnErrorRes);
observable.OfType().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
のような新しいメッセージを送信するたびにエラーコールバックに登録する必要があります。以下はその例です。
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要素に対して常に専用のエラーステートを実装します。これにより、アプリケーション全体が完全に ‘壊れる’ のを防ぎ、半運用状態で実行できるようになります。
- 安全で信頼性の高いログメカニズムを実装し、エラーを適切な場所(たとえば、ローカルストレージ)に記録します。繰り返しエラーが発生した場合、ログは原因を特定して対処するのを簡素化します。
- ユーザーがエラーを通知できるメカニズムを作成します。これは、アプリケーション内で連絡先情報を提供するだけでなく、新しいエラーが発生したときにトリガーされる自動フィードバック送信サービスを追加するなど、シンプルまたは複雑なものにすることができます。
- エラーが発生したときに使用されているリソースが適切にクリーンアップされることを確認します。ほとんどの言語は ‘ガベージコレクター’ サービスを提供していますが、カスタムリソースの廃棄ロジックを指定することもできます。