Lewati ke isi

Penanganan kesalahan

Penanganan kesalahan adalah bagian penting dari aplikasi Open API yang andal dan ramah pengguna. Kecuali Anda menangkap dan memproses berbagai kesalahan, pengguna Anda mungkin mengalami UI yang cacat atau mungkin dicegah dari melakukan beberapa tindakan penting sepenuhnya.

Secara umum, proses penanganan kesalahan yang berbeda dapat diimplementasikan tergantung pada lapisan di mana kesalahan terjadi.

  • Di lapisan data dan domain. Dalam beberapa kasus, backend cTrader mungkin mengirim pesan ProtoErrorRes sebagai respons terhadap salah satu permintaan Anda. Untuk operasi yang terkait dengan order, deal, atau posisi, Anda juga mungkin menerima pesan ProtoOAOrderErrorEvent.
  • Di lapisan domain dan aplikasi. Pengguna dapat melakukan tindakan yang tidak Anda pertimbangkan dalam kode Anda, mengakibatkan aplikasi Anda berperilaku tidak terduga.

Mekanisme untuk menangani kesalahan di tingkat ini berbeda dan dijelaskan di bawah ini.

Penanganan kesalahan di lapisan data dan domain

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

  • Mencoba menempatkan order untuk simbol yang pasarnya tutup.
  • Mengirim pesan yang salah atau tidak didukung.
  • Mencoba memodifikasi order yang sedang dieksekusi.
  • Mengirim pesan setelah kehilangan koneksi Anda ke backend cTrader.

Analisis kesalahan

Baik ProtoErrorRes maupun ProtoOAOrderErrorEvent memiliki bidang errorCode dan description yang berisi informasi tepat tentang jenis kesalahan yang terjadi dan deskripsinya. Anda dapat melihat daftar lengkap semua kode kesalahan yang didukung dalam enum ProtoErrorCode.

Untuk memastikan bahwa aplikasi Anda tidak rusak dalam kasus seperti itu, Anda biasanya dapat berlangganan callback yang dipicu saat Anda menerima respons kesalahan. Logika tepat dari callback ini serta cara Anda dapat berlangganan mereka tergantung pada klien yang Anda gunakan untuk membangun koneksi dan mendengarkan aliran pesan.

Bekerja dengan JSON

Saat bekerja dengan JSON, Anda masih dapat menggunakan kembali kode dari tutorial ini; namun, Anda perlu sedikit memodifikasinya tergantung pada pendekatan Anda terhadap serialisasi dan deserialisasi serta klien TCP dan WebSocket yang Anda pilih.

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

Saat menggunakan library twisted untuk menangani operasi asinkron, Anda harus berlangganan callback kesalahan setiap kali Anda mengirim pesan baru seperti yang ditunjukkan dalam contoh di bawah ini 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)

Penanganan kesalahan di lapisan domain dan aplikasi

Cara Anda menangani kesalahan di lapisan domain dan aplikasi tergantung pada bahasa pemrograman yang Anda pilih, framework UI, dan kasus penggunaan yang Anda implementasikan, sehingga sulit untuk memberikan cuplikan kode dan solusi spesifik.

Namun, rekomendasi berikut dapat berguna terlepas dari bagaimana Anda memilih untuk mengintegrasikan dengan Open API cTrader.

  • Selalu implementasikan status kesalahan khusus untuk elemen UI utama. Ini akan mencegah aplikasi Anda rusak sepenuhnya dan memungkinkan untuk berjalan dalam keadaan semi-degradasi.
  • Implementasikan mekanisme logging yang aman dan andal yang akan mencatat kesalahan di lokasi yang sesuai (misalnya, penyimpanan lokal). Jika kesalahan berulang terjadi, logging harus menyederhanakan identifikasi dan penanganan penyebabnya.
  • Buat mekanisme bagi pengguna untuk memberi tahu Anda tentang kesalahan. Ini bisa sesederhana memberikan informasi kontak Anda dalam aplikasi atau serumit menambahkan layanan pengiriman umpan balik otomatis yang dipicu oleh kesalahan baru.
  • Pastikan bahwa sumber daya apa pun yang digunakan saat kesalahan terjadi dibersihkan dengan benar. Meskipun sebagian besar bahasa menawarkan layanan pengumpul sampah, Anda mungkin ingin menentukan logika pembuangan sumber daya kustom.