Neden istisna değildir.() printStackTrace olarak kötü bir uygulama mı?
lot material dışında bir özel durum yığın izlemesi baskı kötü olduğunu gösteriyor there bir uygulama var.
E. g. Checkstyle kontrol: RegexpSingleline
Bu kontrol kullanılabilir [...] eski arama gibi ortak bir kötü uygulama bulmak için.() printStacktrace
Ancak, kesinlikle bir yığın beri izleme istisna neden izleme çok yararlıdır neden geçerli bir neden veren herhangi bir yerde bulmak için mücadele ediyorum. Bildiğim şeyler:
1) Bir iz asla son kullanıcılara visibile (kullanıcı deneyimi ve güvenlik amaçlı) olmalıdır yığını
2) bir yığın izlemesi Üreten nispeten pahalı bir işlem (olası bir sorun için en 'özel durum güvenmemek koşullar) rağmen
3) günlük Birçok çerçeveleri yazdırma (bizimki değil ve hayır, kolay kolay değiştiremeyiz) için yığın izleme
4) Baskı izleme, hata işleme teşkil etmez yığını. Diğer bilgiler günlük ve özel durum işleme ile kombine edilmelidir.
Diğer sebep baskı önlemek için bir kod yığın izlemesi ne var?
CEVAP
Throwable.printStackTrace()
yığın System.err
PrintStream izleme yazar. System.err
akış ve temel standart "hata" JVM sürecinin akışı yeniden tarafından olabilir çıktı
- hedef değiştiren
System.setErr()
çağırmaSystem.err
ile işaret etti. - ya yönlendirerek süreci' hata çıkış akışı. Hata çıkış akışı dosya/aygıt yönlendirilebilir
- personel tarafından göz ardı edilebilir olan,
- dosya/aygıt günlük rotasyon yeteneğine sahip, yeniden Dosya Aç/cihazı kapatmak için gerekli bir süreç kolu bu album, dosya/aygıt mevcut içerikleri arşivleme önce olmayabilir.
- ya da dosya/aygıt aslında
/dev/null
gibi tüm veriler için yazılan atar.
Yukarıdaki Throwable.printStackTrace()
çağırma dan çıkarım teşkil geçerli (iyi/büyük) özel durum işleme davranış, yalnızca
- eğer
System.err
uygulamanın ömrü süresince yeniden olmak zorunda - ve eğer günlük rotasyon gerekli değilse uygulama çalışırken,
- ve eğer kabul/uygulama günlüğü uygulama tasarlanmış
System.err
(JVM standart hata çıkış akışı) yazmaktır.
Çoğu durumda, yukarıdaki koşulları değil uygulandı. Bir olmayabilir farkında olun diğer kod çalışan JVM, ve kimse tahmin edemez boyutu günlük dosyası veya çalışma zamanı, süresi, süreci ve iyi tasarlanmış günlük pratik etrafında döner yazı "makine-parseable" günlük dosyaları (bir tercih ama opsiyonel bir logger) olarak bilinen hedef, yardım destek.
Son olarak, bir gerektiğini unutmayın çıkışı Throwable.printStackTrace()
kesinlikle olsun aralanmış ile diğer yazılı içerik için System.err
(ve hatta System.out
eğer her iki yönlendirilir, aynı dosya/aygıt). Bu özel durumlar böyle bir durumda kolayca parseable burda değil veri ile uğraşmak gerekir, bu bir sıkıntı (tek iş parçacıklı uygulamalar için). Daha da kötüsü, bir çok iş parçacıklı uygulama Throwable.printStackTrace()
çok kafa karıştırıcı günlükleri üretecek olması kuvvetle muhtemeldir-güvenli iş parçacığı değil.
Bu yazı birden çok iş parçacığı aynı anda Throwable.printStackTrace()
çağırmak System.err
yığın izleme eşitlemek için eşitleme mekanizması yok. Çözme bu aslında gerektirir kodunuzu senkronize monitörde ilişkili System.err
(**16 yaşında, eğer hedef dosya/aygıt aynı), ve bu oldukça ağır bir fiyat ödemek için günlük dosyası aklı. Alın bir örnek, ConsoleHandler
StreamHandler
sınıfların sorumlu ekleme günlük kayıtları için konsol, günlük tesis tarafından sağlanan java.util.logging
; asıl işlem yayın günlük kayıtları senkronize - her konu bu girişimleri yayınlama için bir günlük kaydı gereken ders kilidi monitör ile ilgili StreamHandler
örneği. İstiyorsanız, aynı garanti olması eklenmemiş günlük kayıtlarını kullanarak System.out
/System.err
gerekir sağlamak aynı mesajları yayınlanan bu akarsu bir seri hale getirilebilir bir şekilde.
Tüm yukarıda ve Throwable.printStackTrace()
aslında yararlıdır çok kısıtlı senaryoları göz önüne alındığında, genellikle yürütmesini kötü bir uygulama olduğu ortaya çıktı.
Önceki paragraf bir argüman uzanan, konsola yazan bir aracı ile birlikte Throwable.printStackTrace
kullanım için kötü bir seçimdir. Bu kısmen nedeniyle nedeni logger ki senkronize bir farklı monitör, süre uygulama (muhtemelen, eğer istemiyorsan aralanmış günlük kayıtları) senkronize farklı bir monitör. Bağımsız uygulama da aynı hedef için yazma, iki farklı kaydediciler kullandığınızda iyi tutar.
Neden görünümünde hazırda açık oturum ...
PHP global değişkenleri olarak kötü bi...
Neden 'diziler JavaScript kötü uy...
Neden &; ad std quot;" kötü olara...
Neden alloca kullanımı() olarak iyi bi...