Bir istisnayı yalnızca bir catch bloğu kullanarak günlüğe kaydetmeye karar verdiğiniz için yeniden düzenlemek (istisna hiç değişmediği anlamına gelir) kötü bir fikirdir.
İstisnaları, istisna mesajlarını ve işlenmesini kullanmamızın nedenlerinden biri, neyin yanlış gittiğini ve akıllıca yazılmış istisnaların hatayı büyük bir farkla bulmasını hızlandırabilmemizdir.
Ayrıca, istisnaları ele almanın if
, sahip olduğumuzdan çok daha fazla kaynağa mal olduğunu unutmayın; Uygulamanızın performansı üzerinde etkisi vardır.
Ancak, hatanın göründüğü uygulama katmanını işaretlemek için istisnayı bir araç olarak kullanmak iyi bir yaklaşımdır.
Aşağıdaki yarı sahte kodu düşünün:
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
}
}
Birisinin kodu aradığını ve aldığını GetNumberAndReturnCode
ve 500
bir hata sinyali aldığını varsayalım . Günlük dosyasını açıp şunu gören desteği arayacaktı:
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
Geliştirici daha sonra yazılımın hangi katmanının işlemin iptal edilmesine neden olduğunu hemen bilir ve sorunu tanımlamanın kolay bir yoluna sahiptir. Bu durumda önemlidir, çünkü Redis zaman aşımı asla gerçekleşmemelidir.
Belki başka bir kullanıcı aynı yöntemi çağırır, 500
kodu alır, ancak günlük aşağıdakileri gösterir:
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.
Bu durumda destek, var olmayan bir kimlik için bir değer istediği için kullanıcıya isteğin geçersiz olduğuna yanıt verebilir.
özet
İstisnaları ele alıyorsanız, bunları doğru şekilde ele aldığınızdan emin olun. Ayrıca, istisnalarınızın mimari katmanlarınızı izleyerek ilk etapta doğru verileri / mesajları içerdiğinden emin olun, böylece mesajlar oluşabilecek bir sorunu tanımlamanıza yardımcı olur.