ขณะนี้ฉันกำลังปรับโครงสร้างระบบย่อยขนาดใหญ่ด้วยสถาปัตยกรรมหลายเลเยอร์และฉันพยายามดิ้นรนเพื่อออกแบบกลยุทธ์การบันทึกข้อผิดพลาด \ การจัดการที่มีประสิทธิภาพ
สมมติว่าสถาปัตยกรรมของฉันประกอบด้วยสามชั้นต่อไปนี้:
- ส่วนต่อประสานสาธารณะ (IE เป็น MVC Controller)
- เลเยอร์โดเมน
- ชั้นการเข้าถึงข้อมูล
แหล่งที่มาของความสับสนของฉันคือที่ฉันควรใช้การบันทึกข้อผิดพลาด \ การจัดการ:
ทางออกที่ง่ายที่สุดคือการใช้การบันทึกที่ระดับบนสุด (IE the Public Interface \ MVC Controller) อย่างไรก็ตามสิ่งนี้รู้สึกผิดเพราะมันหมายถึงการทำให้ข้อยกเว้นผ่านเลเยอร์ที่แตกต่างกันแล้วบันทึกมัน แทนที่จะบันทึกข้อยกเว้นที่แหล่งที่มา
การบันทึกข้อยกเว้นที่แหล่งที่มานั้นเป็นทางออกที่ดีที่สุดเพราะฉันมีข้อมูลมากที่สุด ปัญหาของฉันคือว่าฉันไม่สามารถตรวจจับทุกข้อยกเว้นที่แหล่งที่มาโดยไม่มีการยกเว้นข้อยกเว้นทั้งหมดและในเลเยอร์อินเทอร์เฟซของโดเมน / สาธารณะสิ่งนี้จะนำไปสู่การตรวจจับข้อยกเว้นที่ถูกจับบันทึกไว้แล้ว .
อีกกลยุทธ์ที่เป็นไปได้คือการผสมผสานของ # 1 และ # 2; โดยที่ฉันตรวจจับข้อยกเว้นเฉพาะที่เลเยอร์พวกเขามักจะถูกโยน (IE Catching, การบันทึกและการโยนอีกครั้ง
SqlExceptions
ใน Data Access Layer) แล้วบันทึกข้อยกเว้นที่ไม่ถูกตรวจจับเพิ่มเติมที่ระดับบนสุด อย่างไรก็ตามสิ่งนี้จะทำให้ฉันต้องจับและเชื่อมต่อใหม่ทุกข้อยกเว้นที่ระดับบนสุดเพราะฉันไม่สามารถแยกแยะความผิดพลาดระหว่างข้อผิดพลาดที่ได้รับการจัดการ \ จัดการกับข้อผิดพลาดที่ไม่มี
ตอนนี้เห็นได้ชัดว่านี่เป็นปัญหาในแอปพลิเคชั่นซอฟต์แวร์ส่วนใหญ่ดังนั้นจึงต้องมีวิธีแก้ไขปัญหามาตรฐานที่ทำให้เกิดข้อยกเว้นในการจับแหล่งที่มาและบันทึกครั้งเดียว แต่ฉันไม่สามารถเห็นวิธีการทำสิ่งนี้ด้วยตัวเอง
หมายเหตุชื่อของคำถามนี้คล้ายกับ ' ข้อยกเว้นการบันทึกในแอปพลิเคชันหลายระดับ " ' อย่างไรก็ตามคำตอบในโพสต์นั้นไม่มีรายละเอียดและไม่เพียงพอที่จะตอบคำถามของฉัน
The easiest solution would be to implement the logging at the top level
- ทำเช่นนี้. การบันทึกข้อยกเว้นที่แหล่งที่มาของพวกเขาไม่ใช่ความคิดที่ดีและทุกแอปพลิเคชันที่ฉันพบนั่นเป็น PITA ในการดีบัก ควรเป็นความรับผิดชอบของผู้โทรในการจัดการข้อยกเว้น
try{ ... } catch(Exception ex) { Log(ex); }
จะส่งผลให้เกิดข้อยกเว้นเดียวกันกับที่ถูกบันทึกไว้ในแต่ละเลเยอร์ (ดูเหมือนจะเป็นการฝึกที่ไม่ดีนักที่จะจับทุกข้อยกเว้นในทุกเลเยอร์ในฐานรหัส)