Langkau tajuk talian

Pengendalian ralat

Pengendalian ralat adalah bahagian penting bagi mana-mana aplikasi Open API yang boleh dipercayai dan mesra pengguna. Melainkan anda menangkap dan memproses pelbagai ralat, pengguna anda mungkin mengalami UI yang rosak atau mungkin dihalang daripada melakukan beberapa tindakan penting sepenuhnya.

Secara umumnya, proses pengendalian ralat yang berbeza boleh dilaksanakan bergantung pada lapisan di mana ralat berlaku.

  • Pada lapisan data dan domain. Dalam beberapa kes, sistem bahagian belakang cTrader mungkin menghantar mesej ProtoErrorRes sebagai respons kepada salah satu permintaan anda. Untuk operasi yang berkaitan dengan pesanan, urus niaga atau posisi, anda juga mungkin menerima mesej ProtoOAOrderErrorEvent.
  • Pada lapisan domain dan aplikasi. Pengguna mungkin melakukan tindakan yang anda tidak pertimbangkan dalam kod anda, menyebabkan aplikasi anda berfungsi secara tidak dijangka.

Mekanisme untuk mengendalikan ralat pada tahap ini berbeza dan diterangkan di bawah.

Pengendalian ralat pada lapisan data dan domain

Anda mungkin menerima ProtoErrorRes atau ProtoOAOrderErrorEvent dalam situasi berikut (perhatikan bahawa senarai ini tidak lengkap):

  • Cuba meletakkan pesanan untuk simbol yang pasaran telah ditutup.
  • Menghantar mesej yang salah atau tidak disokong.
  • Cuba mengubah suai pesanan yang sedang dilaksanakan.
  • Menghantar mesej selepas kehilangan sambungan anda ke sistem bahagian belakang cTrader.

Analisis ralat

Kedua-dua ProtoErrorRes dan ProtoOAOrderErrorEvent mempunyai medan errorCode dan description yang mengandungi maklumat tepat tentang jenis ralat yang berlaku dan keterangannya. Anda boleh melihat senarai penuh semua kod ralat yang disokong dalam enum ProtoErrorCode.

Untuk memastikan aplikasi anda tidak rosak dalam kes sedemikian, anda biasanya boleh melanggan callback yang dicetuskan apabila anda menerima respons ralat. Logik tepat callback ini serta cara anda boleh melanggannya bergantung pada klien yang anda gunakan untuk mewujudkan sambungan dan mendengar aliran mesej.

Bekerja dengan JSON

Apabila beroperasi dengan JSON, anda masih boleh menggunakan semula kod dari tutorial ini; walau bagaimanapun, anda perlu mengubahnya sedikit bergantung pada pendekatan anda terhadap serialisasi dan deserialisasi serta klien TCP dan WebSocket pilihan anda.

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

Apabila menggunakan pustaka twisted untuk mengendalikan operasi asinkron, anda perlu melanggan callback ralat setiap kali anda menghantar mesej baharu seperti yang ditunjukkan dalam contoh di bawah untuk 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)

Pengendalian ralat pada lapisan domain dan aplikasi

Cara anda mengendalikan ralat pada lapisan domain dan aplikasi bergantung pada bahasa pengaturcaraan yang anda pilih, rangka kerja UI dan kes penggunaan yang anda laksanakan, menjadikannya sukar untuk memberikan coretan kod dan penyelesaian khusus.

Walau bagaimanapun, cadangan berikut boleh menjadi berguna tanpa mengira cara anda memilih untuk berintegrasi dengan cTrader Open API.

  • Sentiasa laksanakan keadaan ralat khusus untuk elemen UI utama. Ini akan menghalang aplikasi anda daripada rosak sepenuhnya dan membolehkannya berjalan dalam keadaan separa terdegradasi.
  • Laksanakan mekanisme log yang selamat dan boleh dipercayai yang akan merekodkan ralat di lokasi yang sesuai (contohnya, penyimpanan tempatan). Jika ralat berulang berlaku, log sepatutnya memudahkan mengenal pasti dan menangani punca mereka.
  • Cipta mekanisme untuk pengguna memaklumkan anda tentang ralat. Ini boleh semudah memberikan maklumat hubungan anda dalam aplikasi atau sekompleks menambah perkhidmatan penghantaran maklum balas automatik yang dicetuskan pada ralat baharu.
  • Pastikan sebarang sumber yang digunakan apabila ralat berlaku dibersihkan dengan betul. Walaupun kebanyakan bahasa menawarkan perkhidmatan pengumpul sampah, anda mungkin ingin menentukan logik pelupusan sumber tersuai.