Şu anda çok katmanlı bir mimariye sahip büyük bir alt sistemi yeniden düzenliyorum ve etkili bir hata günlüğü tutma / işleme stratejisi tasarlamaya çalışıyorum.
Diyelim ki mimarim aşağıdaki üç katmandan oluşuyor:
- Genel Arayüz (IE ve MVC Kontrol Cihazı)
- Alan Adı Katmanı
- Veri Erişim Katmanı
Benim karışıklık kaynağı nerede hata günlüğü \ işleme uygulamak gerekir:
En kolay çözüm, günlük kaydını en üst düzeyde uygulamaktır (IE Genel Arabirim \ MVC Denetleyicisi). Ancak bu yanlış hissettirir, çünkü farklı katmanlar arasında istisnayı patlatmak ve sonra günlüğe kaydetmek anlamına gelir; istisnayı kaynağında günlüğe kaydetmek yerine.
İstisna kaynağında günlüğe kaydedilir, en iyi çözümdür çünkü en fazla bilgiye sahibim. Bununla ilgili sorunum, TÜM istisnaları yakalamadan kaynaktaki her istisnayı yakalayamıyorum ve etki alanı / genel arabirim katmanında, bu, aşağıdaki katman tarafından zaten yakalanmış, günlüğe kaydedilmiş ve yeniden atılan istisnaların yakalanmasına yol açacaktır. .
Başka bir olası strateji, # 1 ve # 2'nin bir karışımıdır; böylece atılacakları en olası katmandaki özel istisnaları yakalarım (IE Yakalama, günlüğe kaydetme ve
SqlExceptions
Veri Erişim Katmanında yeniden atma ) ve daha sonra yakalanmamış diğer istisnaları en üst düzeyde günlüğe kaydederim. Ancak bu, üst düzeydeki her istisnayı yakalamamı ve yeniden kaydetmemi gerektiriyor, çünkü zaten kaydedilmiş \ ele alınmamış hataları vs olmayanlar arasında ayırt edemiyorum.
Şimdi, açıkçası bu, çoğu yazılım uygulamasında bir sorundur, bu nedenle, istisnaların kaynağa yakalanması ve bir kez kaydedilmesi ile sonuçlanan bu soruna standart bir çözüm bulunmalıdır; ancak bunu kendim nasıl yapacağımı göremiyorum.
Bu sorunun başlığı, ' Çok katmanlı bir uygulamada günlüğe kaydetme istisnaları ' ile çok benzer , ancak bu yayındaki yanıtların ayrıntıları eksik ve sorumu yanıtlamak için yeterli değil.
The easiest solution would be to implement the logging at the top level
- Bunu yap. İstisnaları kaynağında kaydetmek iyi bir fikir değildir ve karşılaştığım her uygulama hata ayıklamak için bir PITA idi. İstisnaları ele almak arayanın sorumluluğunda olmalıdır.
try{ ... } catch(Exception ex) { Log(ex); }
ve her bir katmanda kodu kaydırma aynı istisna her katmanda günlüğe neden olur. (Ayrıca, kod tabanındaki her katmandaki her istisnayı yakalamak da oldukça kötü bir uygulama gibi görünüyor.)