ฉันไม่เชื่อว่าการจับในท้องถิ่นเป็นรูปแบบการต่อต้านในความเป็นจริงถ้าฉันจำได้อย่างถูกต้องมันบังคับใช้จริงใน Java!
สิ่งสำคัญสำหรับฉันเมื่อใช้งานการจัดการข้อผิดพลาดคือกลยุทธ์โดยรวม คุณอาจต้องการตัวกรองที่ดักจับข้อยกเว้นทั้งหมดที่ขอบเขตบริการคุณอาจต้องการดักจับด้วยตนเอง - ทั้งคู่ใช้ได้ดีตราบใดที่มีกลยุทธ์โดยรวมซึ่งจะอยู่ในมาตรฐานการเข้ารหัสของทีม
ส่วนตัวฉันชอบที่จะตรวจจับข้อผิดพลาดภายในฟังก์ชั่นเมื่อฉันสามารถทำอย่างใดอย่างหนึ่งต่อไปนี้:
- เพิ่มข้อมูลเชิงบริบท (เช่นสถานะของวัตถุหรือสิ่งที่เกิดขึ้น)
- จัดการข้อยกเว้นอย่างปลอดภัย (เช่นวิธี TryX)
- ระบบของคุณกำลังข้ามขอบเขตการให้บริการและโทรไปยังไลบรารีหรือ API ภายนอก
- คุณต้องการที่จะจับและสร้างข้อยกเว้นประเภทต่าง ๆ ขึ้นมาใหม่ (อาจเป็นข้อยกเว้นต้นฉบับ)
- มีการโยนข้อยกเว้นเป็นส่วนหนึ่งของฟังก์ชันการทำงานเบื้องหลังที่มีมูลค่าต่ำ
หากไม่ใช่กรณีเหล่านี้ฉันจะไม่เพิ่มการลอง / จับท้องถิ่น ถ้าเป็นเช่นนั้นขึ้นอยู่กับสถานการณ์ฉันอาจจัดการกับข้อยกเว้น (ตัวอย่างเช่นวิธี TryX ที่ส่งกลับค่าเท็จ) หรือทำใหม่ดังนั้นข้อยกเว้นจะได้รับการจัดการโดยกลยุทธ์ระดับโลก
ตัวอย่างเช่น:
public bool TryConnectToDatabase()
{
try
{
this.ConnectToDatabase(_databaseType); // this method will throw if it fails to connect
return true;
}
catch(Exception ex)
{
this.Logger.Error(ex, "There was an error connecting to the database, the databaseType was {0}", _databaseType);
return false;
}
}
หรือตัวอย่างการทำใหม่:
public IDbConnection ConnectToDatabase()
{
try
{
// connect to the database and return the connection, will throw if the connection cannot be made
}
catch(Exception ex)
{
this.Logger.Error(ex, "There was an error connecting to the database, the databaseType was {0}", _databaseType);
throw;
}
}
จากนั้นคุณจับข้อผิดพลาดที่ด้านบนของสแต็กและนำเสนอข้อความที่เป็นมิตรกับผู้ใช้ที่ดีให้กับผู้ใช้
ไม่ว่าคุณจะใช้วิธีใดมันคุ้มค่าในการสร้างการทดสอบหน่วยสำหรับสถานการณ์นี้ดังนั้นคุณจึงสามารถมั่นใจได้ว่าฟังก์ชั่นจะไม่เปลี่ยนแปลงและขัดขวางการไหลของโครงการในภายหลัง
คุณไม่ได้พูดถึงภาษาที่คุณใช้ แต่เป็นนักพัฒนา. NET และได้เห็นสิ่งนี้หลายครั้งเกินไปที่จะไม่พูดถึงมัน
อย่าเขียน:
catch(Exception ex)
{
throw ex;
}
ใช้:
catch(Exception ex)
{
throw;
}
อดีตรีเซ็ตการติดตามสแต็กและทำให้ระดับสูงสุดของคุณจับไร้ประโยชน์อย่างเต็มที่!
TLDR
การจับภาพในเครื่องไม่ใช่รูปแบบต่อต้าน แต่มักจะเป็นส่วนหนึ่งของการออกแบบและสามารถช่วยเพิ่มบริบทเพิ่มเติมให้กับข้อผิดพลาดได้