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?
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:
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.
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:
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.
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.
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ı.