การสร้างข้อยกเว้นใหม่อีกครั้งเนื่องจากคุณตัดสินใจที่จะเข้าสู่ระบบโดยใช้ catch block (หมายถึงข้อยกเว้นไม่ได้เปลี่ยนแปลงเลย) เป็นความคิดที่ไม่ดี
หนึ่งในเหตุผลที่เราใช้ข้อยกเว้นข้อความข้อยกเว้นและการจัดการของมันคือเพื่อให้เรารู้ว่าสิ่งที่ผิดพลาดและข้อยกเว้นที่เขียนอย่างชาญฉลาดสามารถเพิ่มความเร็วในการค้นหาข้อผิดพลาดโดยอัตรากำไรขั้นต้นที่ดี
นอกจากนี้โปรดจำไว้ว่าการจัดการข้อยกเว้นมีค่าใช้จ่ายมากกว่าแหล่งที่มีสมมติว่าคุณมีif
ดังนั้นคุณไม่ควรจัดการพวกมันทั้งหมดบ่อยครั้งเพียงเพราะคุณรู้สึกว่ามัน มันส่งผลกระทบต่อประสิทธิภาพการทำงานของแอปพลิเคชันของคุณ
อย่างไรก็ตามเป็นวิธีการที่ดีในการใช้การยกเว้นเป็นค่าเฉลี่ยเพื่อทำเครื่องหมายชั้นแอปพลิเคชันที่มีข้อผิดพลาดปรากฏขึ้น
พิจารณารหัสกึ่งหลอกต่อไปนี้:
interface ICache<T, U>
{
T GetValueByKey(U key); // may throw an CacheException
}
class FileCache<T, U> : ICache<T, U>
{
T GetValueByKey(U key)
{
throw new CacheException("Could not retrieve object from FileCache::getvalueByKey. The File could not be opened. Key: " + key);
}
}
class RedisCache<T, U> : ICache<T, U>
{
T GetValueByKey(U key)
{
throw new CacheException("Could not retrieve object from RedisCache::getvalueByKey. Failed connecting to Redis server. Redis server timed out. Key: " + key);
}
}
class CacheableInt
{
ICache<int, int> cache;
ILogger logger;
public CacheableInt(ICache<int, int> cache, ILogger logger)
{
this.cache = cache;
this.logger = logger;
}
public int GetNumber(int key) // may throw service exception
{
int result;
try {
result = this.cache.GetValueByKey(key);
} catch (Exception e) {
this.logger.Error(e);
throw new ServiceException("CacheableInt::GetNumber failed, because the cache layer could not respond to request. Key: " + key);
}
return result;
}
}
class CacheableIntService
{
CacheableInt cacheableInt;
ILogger logger;
CacheableInt(CacheableInt cacheableInt, ILogger logger)
{
this.cacheableInt = cacheableInt;
this.logger = logger;
}
int GetNumberAndReturnCode(int key)
{
int number;
try {
number = this.cacheableInt.GetNumber(key);
} catch (Exception e) {
this.logger.Error(e);
return 500; // error code
}
return 200; // ok code
}
}
สมมติว่ามีคนเรียกรหัสGetNumberAndReturnCode
และรับ500
รหัสเพื่อส่งสัญญาณข้อผิดพลาด เขาจะเรียกฝ่ายสนับสนุนที่จะเปิดไฟล์บันทึกและดูนี้:
ERROR: 12:23:27 - Could not retrieve object from RedisCache::getvalueByKey. Failed connecting to Redis server. Redis server timed out. Key: 28
ERROR: 12:23:27 - CacheableInt::GetNumber failed, because the cache layer could not respond to request. Key: 28
นักพัฒนาซอฟต์แวร์ทราบทันทีว่าเลเยอร์ของซอฟต์แวร์ใดที่ทำให้กระบวนการยกเลิกและมีวิธีง่าย ๆ ในการระบุปัญหา ในกรณีนี้มันสำคัญมากเพราะ Redis หมดเวลาไม่ควรเกิดขึ้น
บางทีผู้ใช้รายอื่นอาจเรียกวิธีเดียวกันนี้รับ500
รหัสด้วยเช่นกัน แต่บันทึกจะแสดงดังต่อไปนี้:
INFO: 11:11:11- Could not retrieve object from RedisCache::getvalueByKey. Value does not exist for the key 28.
INFO: 11:11:11- CacheableInt::GetNumber failed, because the cache layer could not find any data for the key 28.
ในกรณีนี้ฝ่ายสนับสนุนสามารถตอบสนองต่อผู้ใช้ว่าการร้องขอนั้นไม่ถูกต้องเพราะเขากำลังขอค่าสำหรับ ID ที่ไม่มีอยู่จริง
สรุป
หากคุณกำลังจัดการข้อยกเว้นตรวจสอบให้แน่ใจว่าได้จัดการกับพวกเขาในวิธีที่ถูกต้อง ตรวจสอบให้แน่ใจว่าข้อยกเว้นของคุณมีข้อมูล / ข้อความที่ถูกต้องตั้งแต่แรกตามเลเยอร์สถาปัตยกรรมของคุณดังนั้นข้อความจะช่วยคุณระบุปัญหาที่อาจเกิดขึ้น