ข้ามไปที่เนื้อหา

การจัดการข้อผิดพลาด

การจัดการข้อผิดพลาดเป็นส่วนสำคัญของแอปพลิเคชัน Open API ที่เชื่อถือได้และใช้งานง่าย หากคุณไม่จับและประมวลผลข้อผิดพลาดต่างๆ ผู้ใช้ของคุณอาจประสบปัญหา UI ที่มีข้อบกพร่องหรืออาจไม่สามารถดำเนินการบางอย่างที่สำคัญได้เลย

โดยทั่วไปแล้ว กระบวนการจัดการข้อผิดพลาดที่แตกต่างกันอาจถูกใช้งานขึ้นอยู่กับเลเยอร์ที่เกิดข้อผิดพลาด

  • ที่เลเยอร์ข้อมูลและโดเมน ในบางกรณี backend ของ cTrader อาจส่ง ข้อความ ProtoErrorRes เป็นการตอบสนองต่อคำขอหนึ่งในคำขอของคุณ สำหรับการดำเนินการที่เกี่ยวข้องกับคำสั่ง, การซื้อขาย หรือโพสิชัน คุณอาจได้รับ ข้อความ ProtoOAOrderErrorEvent
  • ที่เลเยอร์โดเมนและแอปพลิเคชัน ผู้ใช้อาจดำเนินการที่คุณไม่ได้คำนึงถึงในโค้ดของคุณ ส่งผลให้แอปพลิเคชันของคุณทำงานไม่เป็นไปตามที่คาดหวัง

กลไกสำหรับการจัดการข้อผิดพลาดในระดับเหล่านี้แตกต่างกันและอธิบายไว้ด้านล่าง

การจัดการข้อผิดพลาดที่เลเยอร์ข้อมูลและโดเมน

คุณอาจได้รับ ProtoErrorRes หรือ ProtoOAOrderErrorEvent ในสถานการณ์ต่อไปนี้ (โปรดทราบว่านี่ไม่ใช่รายการทั้งหมด):

  • พยายามวางคำสั่งสำหรับสัญลักษณ์ที่ตลาดปิดอยู่
  • ส่งข้อความที่ไม่ถูกต้องหรือไม่ได้รับการสนับสนุน
  • พยายามแก้ไขคำสั่งที่กำลังดำเนินการอยู่
  • ส่งข้อความหลังจากสูญเสียการเชื่อมต่อกับ backend ของ cTrader

วิเคราะห์ข้อผิดพลาด

ทั้ง ProtoErrorRes และ ProtoOAOrderErrorEvent มีฟิลด์ errorCode และ description ที่มีข้อมูลที่แม่นยำเกี่ยวกับประเภทของข้อผิดพลาดที่เกิดขึ้นและคำอธิบายของข้อผิดพลาดนั้น คุณสามารถดูรายการทั้งหมดของรหัสข้อผิดพลาดที่ได้รับการสนับสนุนใน enum ProtoErrorCode

เพื่อให้แน่ใจว่าแอปพลิเคชันของคุณไม่หยุดทำงานในกรณีดังกล่าว คุณมักจะสามารถสมัครรับ callback ที่จะทำงานเมื่อคุณได้รับข้อความตอบสนองข้อผิดพลาด ลอจิกที่แน่นอนของ callback เหล่านี้รวมถึงวิธีที่คุณสามารถสมัครรับได้ขึ้นอยู่กับไคลเอนต์ที่คุณใช้เพื่อสร้างการเชื่อมต่อและฟังสตรีมข้อความ

ทำงานกับ JSON

เมื่อทำงานกับ JSON คุณยังสามารถนำโค้ดจากบทช่วยสอนนี้มาใช้ใหม่ได้ อย่างไรก็ตาม คุณอาจต้องปรับเปลี่ยนเล็กน้อยขึ้นอยู่กับแนวทางของคุณในการ serialisation และ deserialisation และไคลเอนต์ 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 เพื่อจัดการการดำเนินการแบบอะซิงโครนัส คุณต้องสมัครรับ callback ข้อผิดพลาดทุกครั้งที่ส่งข้อความใหม่ ดังที่แสดงในตัวอย่างด้านล่างสำหรับ 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 หลักเสมอ สิ่งนี้จะป้องกันไม่ให้แอปพลิเคชันของคุณหยุดทำงานทั้งหมดและอนุญาตให้ทำงานในสถานะที่ลดประสิทธิภาพลงบางส่วน
  • ใช้งานกลไกการบันทึกที่ปลอดภัยและเชื่อถือได้ซึ่งจะบันทึกข้อผิดพลาดในตำแหน่งที่เหมาะสม (เช่น ที่เก็บข้อมูลภายในเครื่อง) หากเกิดข้อผิดพลาดซ้ำๆ การบันทึกควรทำให้ง่ายต่อการระบุและแก้ไขสาเหตุ
  • สร้างกลไกสำหรับผู้ใช้เพื่อแจ้งให้คุณทราบเกี่ยวกับข้อผิดพลาด สิ่งนี้อาจง่ายเหมือนกับการให้ข้อมูลติดต่อของคุณภายในแอปพลิเคชันหรือซับซ้อนเหมือนกับการเพิ่มบริการส่งข้อเสนอแนะอัตโนมัติที่ทำงานเมื่อเกิดข้อผิดพลาดใหม่
  • ตรวจสอบให้แน่ใจว่าทรัพยากรใดๆ ที่ใช้เมื่อเกิดข้อผิดพลาดได้รับการทำความสะอาดอย่างเหมาะสม ในขณะที่ภาษาส่วนใหญ่มีบริการ garbage collector คุณอาจต้องการระบุลอจิกการกำจัดทรัพยากรที่กำหนดเอง