ฉันจะเริ่มต้นด้วยแนวทางการออกแบบสำหรับข้อยกเว้นสั้น ๆ และรวมถึง DO, DO NOT และหลีกเลี่ยง มันยังให้เหตุผลว่าทำไม
ในกรณีตัวอย่างของคุณส่วน revelvent จะเป็นการตัดข้อยกเว้น
และคาดว่าจะเขียนด้วยวิธีนี้ โปรดทราบว่ามันจับข้อยกเว้นที่เฉพาะเจาะจงและพยายามที่จะเพิ่มข้อมูลเพื่อให้ข้อความที่มีความหมายมากขึ้นถูกเผยแพร่ โปรดทราบว่าข้อยกเว้นภายในยังคงอยู่เพื่อการบันทึก
//In DataLayer
try
{
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
}
catch(FileNotFoundException ex)
{
throw new TransactionFileMissingException(
"Cannot Access System Information",ex);
}
UPDATE
Kanini ถามว่าถูกต้องหรือไม่หากมีบล็อกข้อยกเว้นนี้ในชั้นข้อมูลหรือควรตรวจสอบไฟล์ที่มีอยู่ในชั้นธุรกิจ
ก่อนอื่นผมอยากจะชี้ให้เห็นว่าเหตุผลในการห่อข้อยกเว้นคือสิ่งนี้
พิจารณาการตัดข้อยกเว้นเฉพาะที่ถูกโยนออกมาจากเลเยอร์ที่ต่ำกว่าในข้อยกเว้นที่เหมาะสมกว่าหากข้อยกเว้นเลเยอร์ที่ต่ำกว่านั้นไม่เหมาะสมในบริบทของการดำเนินการเลเยอร์ที่สูงกว่า
ดังนั้นถ้าคุณรู้สึกว่ามีเลเยอร์ที่สูงกว่าควรรู้เกี่ยวกับไฟล์เลยเลเยอร์ข้อมูลของคุณควรมีลักษณะเช่นนี้
//In DataLayer
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
ไม่ลองไม่จับ
โดยส่วนตัวฉันรู้สึกว่าถ้าชั้นข้อมูลของคุณสามารถทำสิ่งที่มีประโยชน์อย่างเช่นใช้ระบบเริ่มต้น.xmlซึ่งเป็นทรัพยากรแอสเซมบลีการทำอะไรหรือตัดข้อยกเว้นเป็นการเดิมพันที่ดีเนื่องจากการบันทึกของคุณจะบอกคุณว่าวิธีการใด ( throw ex
ในกรณีนี้หรือสิ่งที่ต้องการthrow
ก็ทำเช่นกัน แต่ไม่เพิ่มมูลค่า) ซึ่งหมายความว่าเมื่อระบุว่าคุณจะสามารถแก้ไขปัญหาได้อย่างรวดเร็ว
ตามตัวอย่างที่เฉพาะเจาะจงเช่นนี้ยังมีปัญหาต่อไปนี้ใน XDocument โหลดสามารถโยน execeptions ที่สี่
- ArgumentNullException
- SecurityException
- FileNotFoundException
- UriFormatException
เราไม่สามารถรับประกันได้อย่างปลอดภัยว่ารหัสต่อไปนี้จะไม่แสดงและ FileNotFoundException เพียงเพราะมันอาจเกิดขึ้นเมื่อเราทำการตรวจสอบการมีอยู่และหายไปเมื่อเราทำการโหลด การมีชั้นธุรกิจที่พร้อมใช้งานจะไม่ช่วยอะไร
if (File.Exists("systems.xml"))
XDocument.Load("systems.xml");
SecurityException ยิ่งแย่ลงเนื่องจากสาเหตุอื่น ๆ ที่ทำให้เกิดข้อผิดพลาดนี้หากกระบวนการอื่นคว้าการล็อกไฟล์แบบเอกสิทธิ์เฉพาะบุคคลคุณจะไม่ได้รับข้อผิดพลาดจนกว่าคุณจะลองเปิดอ่านเพราะมันไม่มีวิธี File.CanIOpenThis () และหากวิธีการดังกล่าวมีอยู่คุณยังคงมีปัญหาเช่นเดียวกับ File.Exists