ฉันมักจะเห็นด้วยกับคำเตือนการวิเคราะห์รหัสส่วนใหญ่และฉันพยายามที่จะปฏิบัติตามพวกเขา อย่างไรก็ตามฉันมีเวลายากขึ้นกับสิ่งนี้:
CA1031: อย่าตรวจจับชนิดข้อยกเว้นทั่วไป
ฉันเข้าใจเหตุผลของกฎนี้ แต่ในทางปฏิบัติถ้าฉันต้องการที่จะทำสิ่งเดียวกันโดยไม่คำนึงถึงข้อยกเว้นที่ถูกโยนออกไปทำไมฉันต้องจัดการแต่ละอย่างโดยเฉพาะ? นอกจากนี้หากฉันจัดการข้อยกเว้นเฉพาะจะเกิดอะไรขึ้นถ้ารหัสที่ฉันเรียกจะเปลี่ยนแปลงเพื่อให้เกิดข้อยกเว้นใหม่ในอนาคต ตอนนี้ฉันต้องเปลี่ยนรหัสเพื่อจัดการข้อยกเว้นใหม่นั้น ในขณะที่ถ้าฉันเพียงแค่จับException
รหัสของฉันไม่ต้องเปลี่ยน
ตัวอย่างเช่นถ้า Foo เรียกบาร์และ Foo จำเป็นต้องหยุดการประมวลผลโดยไม่คำนึงถึงประเภทของข้อยกเว้นที่เกิดจาก Bar มีข้อได้เปรียบอะไรบ้างในการระบุประเภทของข้อยกเว้นที่ฉันจับได้
อาจเป็นตัวอย่างที่ดีกว่า:
public void Foo()
{
// Some logic here.
LogUtility.Log("some message");
}
public static void Log()
{
try
{
// Actual logging here.
}
catch (Exception ex)
{
// Eat it. Logging failures shouldn't stop us from processing.
}
}
หากคุณไม่ได้รับการยกเว้นทั่วไปที่นี่คุณต้องรับการยกเว้นทุกประเภทที่เป็นไปได้ Patrick มีจุดดีที่OutOfMemoryException
ไม่ควรจัดการด้วยวิธีนี้ แล้วถ้าฉันต้องการเพิกเฉยทุกข้อยกเว้นOutOfMemoryException
ล่ะ?
OutOfMemoryError
ซึ่งเป็นแยกออกจากException
ต้นไม้มรดกด้วยเหตุผลอย่างที่
OutOfMemoryException
อะไร รหัสการจัดการเช่นเดียวกับทุกอย่างอื่น?