SORU
19 EYLÜL 2011, PAZARTESİ


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
19 EYLÜL 2011, PAZARTESİ


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ğırma System.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.errgerekir 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AndroidSale

    AndroidSale

    17 NİSAN 2011
  • chickenby

    chickenby

    2 HAZİRAN 2008
  • Edgar flores

    Edgar flores

    7 HAZİRAN 2006