Sorun yerel catch bloğu değil, sorun log ve rethrow . İstisnayı ele alın veya ek bağlam ekleyen yeni bir istisna ile sarın ve atın. Aksi takdirde, aynı istisna için birkaç yinelenen günlük girişi ile karşılaşacaksınız.
Buradaki fikir , uygulamanızda hata ayıklama yeteneğini geliştirmektir .
Örnek 1 - Ele alın
try
{
doSomething();
}
catch (Exception e)
{
log.Info("Couldn't do something", e);
doSomethingElse();
}
Kural dışı durumu ele alırsanız, kural dışı durum günlüğü girdisinin önemini kolayca azaltabilirsiniz ve bu kural dışı durumu zincirlemek için bir neden yoktur. Zaten halledildi.
Bir istisnayı ele almak, kullanıcılara bir sorunun olduğunu bildirmeyi, olayı günlüğe kaydetmeyi veya basitçe yok saymayı içerebilir.
NOT: Bir istisnayı kasıtlı olarak yoksayarsanız, boş catch yan tümcesinde bunun nedenini açıkça belirten bir yorum sağlamanızı öneririm. Bu, gelecekteki bakıcıların bunun bir hata veya tembel programlama olmadığını bilmelerini sağlar. Misal:
try
{
context.DrawLine(x1,y1, x2,y2);
}
catch (OutOfMemoryException)
{
// WinForms throws OutOfMemory if the figure you are attempting to
// draw takes up less than one pixel (true story)
}
2. Örnek: Ek bağlam ekleyin ve atın
try
{
doSomething(line);
}
catch (Exception e)
{
throw new MyApplicationException(filename, line, e);
}
Ek bağlam eklemek (ayrıştırma kodundaki satır numarası ve dosya adı gibi), giriş dosyalarında hata ayıklama yeteneğini geliştirmeye yardımcı olabilir - sorunun orada olduğu varsayılarak. Bu bir tür özel durumdur, bu nedenle "ApplicationException" içinde bir istisnayı yeniden paketlemek yalnızca hata ayıklamanıza yardımcı olmaz. Ek bilgi eklediğinizden emin olun.
Örnek 3: İstisna dışında hiçbir şey yapmayın
try
{
doSomething();
}
finally
{
// cleanup resources but let the exception percolate
}
Bu son durumda, istisnanın dokunmadan ayrılmasına izin verirsiniz. En dış katmandaki özel durum işleyici, günlüğe kaydetmeyi işleyebilir. finally
Fıkra kadar temizlenir sizin yöntemiyle gerekli emin tüm kaynakları yapmak için kullanılan, ancak bu istisna atıldı oturum açmak için yer değildir.