"Log and throw" neden anti-model olarak kabul edilir? [kapalı]


89

Bu soru, hiçbir iyi yanıt alamadığım bu makale etrafında bir tartışma ile ateşlendi.

Aksi halde üstesinden gelemiyorsanız neden istisnanızı günlüğe kaydetmek ve sonra yeniden atmak (tabii ki orijinal yığın izini korumak) kötü bir fikir olsun?


Yanıtlar:


129

Sanırım cevabın büyük ölçüde üstesinden gelemiyorsan neden yakalıyorsun? Günlüğe layık olduğunu hissediyorlarsa, neden başa çıkabilecek (ya da başka seçeneği kalmayanların) günlüğe kaydetmesine izin vermiyorlar?

Onu yakalar ve günlüğe kaydedip yeniden atarsanız, yukarı akış kodunun istisnayı zaten kaydettiğinizi bilmesinin bir yolu yoktur ve bu nedenle aynı istisna iki kez günlüğe kaydedilebilir. Daha da kötüsü, tüm yukarı akış kodu aynı modeli takip ederse, istisna, onu yakalamaya, günlüğe kaydetmeye ve ardından tekrar atmaya karar veren koddaki her düzey için bir kez olmak üzere, rastgele bir sayıda günlüğe kaydedilebilir.

Ayrıca bazıları, istisnaları atma ve yakalama görece maliyetli işlemler olduğundan, tüm bu yakalama ve yeniden fırlatma işlemlerinin çalışma zamanı performansınıza yardımcı olmadığını iddia edebilir. Ne de özlü veya sürdürülebilirlik açısından kodunuza yardımcı olmaz.


Daha fazla ayrıntı için, Jeff'in cevabına ilişkin yorumlara bakın
Manu

8
Nedeni daraltmak ve belirli bir mesajı kaydetmek için bir istisnayı günlüğe kaydetmenin ve yeniden atmanın bir nedeni.
Mike Argyriou

12
Cevap: Yığının o anki noktasında, yığın
izlemenin

Yeni istisna daha fazla bilgi veya daha spesifik olarak daha yararlıysa, yakalama ve yeniden fırlatma bazen yardımcı olur.
borjab

1
@Rtconner'ın yorumladığına göre: eşzamansız kodda, yakalayıcı atıcının kullanabileceği içeriğe sahip olmayabilir.
Nir Alfasi

55

Log-and-throw, istisnayı yakalayan ve yeniden atan varlığın, bunun çağrı yığınında daha fazla günlüğe kaydedilmeyecek bilgiler içerdiğine inanmak için bir nedeni varsa - en azından en çok istenen biçimde değil - iyi bir modeldir. Bunun meydana gelmesinin birkaç nedeni:

  1. İstisna, bir uygulama katmanı sınırında yakalanabilir ve yeniden atılabilir ve ayrıcalıklı bilgiler içerebilir. Bir veritabanı katmanının, dış uygulama katmanına erişmek için "kullanıcılar" alanına yinelenen anahtar 'fnord' eklemeye çalışın gibi bir istisnaya izin vermesi kötü olur (bu da bir kullanıcıya ifşa edebilir), ancak Veritabanının iç kısımlarının böyle bir istisna atması ve uygulama arayüzünün onu yakalaması, güvenli bir şekilde günlüğe kaydetmesi ve biraz daha az açıklayıcı bir istisnayı yeniden atması için yararlı olabilir.
  2. Bunun istisnası, dış katmanın büyük olasılıkla kayıt olmadan işlemeyi beklediği bir durum olabilir, ancak iç katman, dış katmanın bilmediği bir şeyi bilebilir ve bu da günlüğe kaydetmenin yararlı olabileceğini düşündürür. Kaba bir örnek olarak, bir orta uygulama katmanı bir sunucuya bağlanmayı denemek için programlanabilir ve bu işe yaramazsa başka birini deneyebilir. Bir sunucu bakım için kapalıyken uygulamanın günlüğünü 'bağlantı başarısız' mesajlarıyla doldurmak, özellikle uygulamanın bakış açısına göre her şey yolunda gittiği için yararlı olmayabilir. Her bir bağlantı girişiminin günlüğü yerine sunucunun ne zaman yukarı ve aşağı gittiğine dair bir rapor oluşturmak için daha sonra günlükleri filtreleyebilen sunucularla ilişkili bir günlük kaynağına bağlantı hatası hakkındaki bilgileri iletmek yararlı olabilir. .

4
# 1 gerçekten mantıklı bir genel kullanım durumudur, ancak OP açıkça "onu yeniden fırlatmayı (tabii ki orijinal yığın izini koruyarak)" sordu, bu nedenle # 1 doğru cevap değil.
Geoffrey Zheng

@GeoffreyZheng: Bu, orijinal yığın izlemesini güvenli bir şekilde günlüğe kaydetmenin "koruma" olarak sayılıp sayılmayacağına bağlı.
supercat

3
# 1 ile ilgili olarak: istisna içeriğini açığa çıkarma ( e.getMessage()UI üzerinde görüntüleme / yığın izleme ve bunu REST yanıtı olarak gönderme gibi), çalışma zamanı istisnası her türlü hassas bilgiyi içerebileceğinden, güvenlik açığının kendisi olarak değerlendirilmelidir. # 2 ile ilgili olarak: istemcinin bilmesini istediğiniz tüm bilgileri ekleyerek (+ temel neden) istisnayı yeniden atabilirsiniz, hiçbir şey kaydetmenize gerek yoktur.
Nikita Bosik

@NikitaBosik: İstisnaların istemci tarafında ifşa edilip edilmeyeceğine bakılmaksızın, bunu yapan uygulamalar yeterince yaygındır ki 'derinlemesine güvenlik' ilkesi istisna mesajlarının hassas bilgilerden arındırılması gerektiğini önerebilir. Ayrıca, dış katman belirli bir istisna türünü günlüğe kaydetmeden veya ilgilenebilecek bir dış varlığa bilgi iletmeden atmayı beklemiyorsa, bir orta katmanın dış katmanın görmezden geleceği bilgileri eklemesi yardımcı olmaz. herhangi bir şey.
supercat

20

Sanırım en basit neden, bunu sizin için yapan tek bir üst düzey işleyiciye sahip olmanızdır, bu nedenle bu istisna işleme ile kodu kirletmenize gerek yoktur.

Kesişen endişeler argümanı temelde sizi ilgilendirmeyen hataları ele almak için zaman kaybı olduğudur. Uygun bir işleyici bulunana kadar hatanın çağrı yığınını yukarı kaldırmasına izin vermek çok daha iyidir.

Kanımca, bir istisna yakalamanız gereken tek zaman, sonuçlarla faydalı bir şeyler yapabileceğiniz zamandır. Basitçe günlüğe kaydetmek için yakalamak yararlı değildir, çünkü bu işi daha da merkezileştirebilirsiniz.


2
Bunu sizin için yapan tek bir üst düzey yöneticinizin olması gerektiğine katılıyorum. Ama benim görüşüme göre, bu üst düzey işleyici "log and throw" -ing OLMALIDIR. Öyleyse argüman "log ve atma" NOKTASINDA, bunu yapıp yapmamak ya da yapmamak için değil mi?!?
Manu

@Manu, sanırım mesele tek bir işleyiciyse (merkezileştirilmiş) sorun değil. Kodu kopyalıyorsanız, bu iyi değil. Bundan daha fazlası olduğunu sanmıyorum!
Jeff Foster

5
@Manu - Bu durumda üst düzey işleyici ne yapıyor? Bana öyle geliyor ki, atılabileceği bir şey varsa, o zaman gerçekten üst düzey işleyici değil. Ve kesinlikle çalışma zamanı ortamının kendisine kadar bir istisnayı yeniden fırlatmak istemezsiniz. Bu, çoğu uygulamayı kilitlenmeyi durduracaktır.
aroth

1
@aroth: Anlıyorum, söylediğiniz şey ya "log and handle" (en üst düzey işleyiciyseniz) veya değilseniz "log ve atma (veya başka şekilde işleme)". Bunu belirttiğiniz için teşekkürler.
Manu

9

IMO günlüğü ve fırlatma, En Az Sürpriz Prensibinin açık bir ihlalidir.

İstisna, çağrı yığınının yukarısında düzgün bir şekilde işlenirse, bir hata günlüğü girişi hiç değmeyebilir. Ve sonra bir hata günlüğü girişi bulmak kafa karıştırıcı.


Hata olmayan günlükler ne olacak?
Su Zhang

6
@SuZhang Sorunuzu tam olarak anlamadım. Hata yoksa atacak bir şey yok. Elbette hatasız günlükler yazabilirsiniz ve yazmalısınız.
Bastian Voigt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.