ด้วย SDK สาธารณะของเราเรามักจะต้องการส่งข้อความที่ให้ข้อมูลอย่างมากเกี่ยวกับสาเหตุที่เกิดข้อยกเว้น ตัวอย่างเช่น:
if (interfaceInstance == null)
{
string errMsg = string.Format(
"Construction of Action Argument: {0}, via the empty constructor worked, but type: {1} could not be cast to type {2}.",
ParameterInfo.Name,
ParameterInfo.ParameterType,
typeof(IParameter)
);
throw new InvalidOperationException(errMsg);
}
อย่างไรก็ตามสิ่งนี้มีแนวโน้มที่จะทำให้การไหลเวียนของรหัสแย่ลงเนื่องจากมีแนวโน้มที่จะให้ความสำคัญกับข้อความแสดงข้อผิดพลาดมากกว่าที่จะทำโค้ด
เพื่อนร่วมงานเริ่ม refactoring ข้อยกเว้นบางอย่างให้กับสิ่งนี้:
if (interfaceInstance == null)
throw EmptyConstructor();
...
private Exception EmptyConstructor()
{
string errMsg = string.Format(
"Construction of Action Argument: {0}, via the empty constructor worked, but type: {1} could not be cast to type {2}.",
ParameterInfo.Name,
ParameterInfo.ParameterType,
typeof(IParameter)
);
return new InvalidOperationException(errMsg);
}
ซึ่งทำให้เข้าใจรหัสได้ง่ายขึ้น แต่เพิ่มวิธีพิเศษมากมายในการจัดการข้อผิดพลาด
มีวิธีอื่นใดบ้างในการหลีกเลี่ยงปัญหา ฉันถามเกี่ยวกับสำนวน C # /. NET เป็นหลัก แต่วิธีการจัดการภาษาอื่น ๆ ก็มีประโยชน์เช่นกัน
[แก้ไข]
มันจะดีถ้ามีข้อดีข้อเสียของแต่ละวิธีเช่นกัน
Exception.Data
คุณสมบัติข้อยกเว้น "จู้จี้จุกจิก" การเรียกใช้การจับโค้ดและเพิ่มบริบทของตัวเองพร้อมกับสแต็คการโทรที่ดักจับข้อมูลส่วนร่วมทั้งหมดที่ควรอนุญาตข้อความ verbose น้อยกว่ามาก ในที่สุดก็System.Reflection.MethodBase
ดูมีแนวโน้มที่จะให้รายละเอียดเพื่อส่งผ่านไปยัง "การก่อสร้างข้อยกเว้น" ของคุณ
Exception.Data
อีกครั้ง ควรเน้นจับ telemetry การรีแฟคเตอร์ที่นี่เป็นเรื่องปกติ แต่มันก็พลาดปัญหา