แก้ไข:
สำหรับบุคคลที่สนใจวิธีที่สะอาดกว่าในการดำเนินการนั้น ลองดูที่ คำตอบ< /ก>.
ในงานของฉัน ฉันมักจะต้องใช้ API ที่สร้างจากภายนอกเพื่อเข้าถึงระบบระยะไกล ตัวอย่างเช่นในการสร้างคำขอและส่งไปยังระบบระยะไกล:
#include "external_lib.h"
void SendRequest(UserRequest user_request)
{
try
{
external_lib::Request my_request;
my_request.SetPrice(user_request.price);
my_request.SetVolume(user_request.quantity);
my_request.SetVisibleVolume(user_request.quantity);
my_request.SetReference(user_request.instrument);
my_request.SetUserID(user_request.user_name);
my_request.SetUserPassword(user_request.user_name);
// Meny other member affectations ...
}
catch(external_lib::out_of_range_error& e)
{
// Price , volume ????
}
catch(external_lib::error_t& e)
{
// Here I need to tell the user what was going wrong
}
}
ตัวตั้งค่าของ lib แต่ละตัวจะตรวจสอบค่าที่ผู้ใช้ระบุไว้ และอาจมีข้อยกเว้นเมื่อผู้ใช้ไม่ปฏิบัติตามความต้องการของระบบระยะไกล ตัวอย่างเช่น ผู้ใช้บางรายอาจไม่ได้รับอนุญาตให้ส่งปริมาณมากเกินไป นั่นคือตัวอย่าง และหลายครั้งที่ผู้ใช้พยายามไม่ปฏิบัติตาม: ไม่มีเครื่องมือที่ใช้ได้ยาวนาน ราคาอยู่นอกขีดจำกัด ฯลฯ ฯลฯ ด้วยเหตุนี้ ผู้ใช้ของเราต้องการข้อผิดพลาดที่ชัดเจน ข้อความเพื่อบอกเขาว่าต้องแก้ไขอะไรในคำขอเพื่อให้ได้รับโอกาสครั้งที่สองในการเขียนคำขอที่ถูกต้อง ฉันต้องให้คำแนะนำดังกล่าวแก่เขา
ไม่ว่าอะไรก็ตาม ข้อยกเว้นของ lib ภายนอก (ส่วนใหญ่) ไม่เคยระบุว่าฟิลด์ใดเป็นแหล่งที่มาของการยกเลิกคำขอ
ตามคุณแล้ววิธีที่ดีที่สุดในการจัดการกับข้อยกเว้นเหล่านั้นคืออะไร?
ความพยายามครั้งแรกของฉันในการจัดการข้อยกเว้นเหล่านั้นคือการ "รวม" คลาสคำขอด้วยของฉัน จากนั้นตัวเซ็ตเตอร์แต่ละตัวจะถูกห่อด้วยวิธีการที่ทำสิ่งเดียวเท่านั้น: บล็อก try/catch catch block จากนั้นจะส่งข้อยกเว้นใหม่ของฉัน: my_out_of_range_volume หรือ my_out_of_range_price ขึ้นอยู่กับผู้ตั้งค่า ตัวอย่างเช่น SetVolume() จะถูกห่อด้วยวิธีนี้:
My_Request::SetVolume(const int volume)
{
try
{
m_Request.SetVolume(volume);
}
catch(external_lib::out_range_error& e)
{
throw my_out_of_range_volume(volume, e);
}
}
คุณคิดอย่างไรกับมัน? คุณคิดอย่างไรเกี่ยวกับข้อยกเว้นในการจัดการค่าใช้จ่ายที่มันบอกเป็นนัย? ... :/
คำถามเปิดอยู่ ฉันต้องการแนวคิดใหม่เพื่อกำจัดข้อจำกัดของ lib!