跳转至

错误处理

错误处理是任何可靠且用户友好的 Open API 应用程序的关键部分。 除非您捕获并处理各种错误,否则您的用户可能会遇到有缺陷的用户界面,或者可能完全无法执行某些基本操作。

广义上讲,可以根据错误发生的层实现不同的错误处理过程。

  • 在数据和领域层。 在某些情况下,cTrader 后端可能会发送 ProtoErrorRes 消息 作为对您请求的响应。 对于与订单、交易或头寸相关的操作,您还可能收到 ProtoOAOrderErrorEvent 消息
  • 在领域和应用层。 用户可能会执行您在代码中未考虑的操作,导致您的应用程序行为异常。

在这些级别处理错误的机制不同,并在下面描述。

在数据和领域层的错误处理

您可能会在以下情况下收到 ProtoErrorResProtoOAOrderErrorEvent(请注意,此列表并非详尽无遗):

  • 尝试为已休市的交易品种下单。
  • 发送错误或不支持的消息。
  • 尝试修改正在执行的订单。
  • 在与 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 元素实现专用的错误状态。 这将防止您的应用程序完全崩溃,并允许在半降级状态下运行。
  • 实现一个安全可靠的日志记录机制,将错误记录在合适的位置(例如本地存储)。 如果重复发生错误,日志记录应简化识别和解决其原因的过程。
  • 创建一个机制,让用户能够向您报告错误。 这可以简单到在应用程序中提供您的联系信息,也可以复杂到添加一个在新错误触发时自动提交反馈的服务。
  • 确保在发生错误时使用的任何资源都被正确清理。 虽然大多数语言都提供垃圾回收服务,但您可能希望指定自定义的资源处理逻辑。