Uygulamamda, kodumu PMD üzerinden çalıştırıyorum, bana şu mesajı gösteriyor:
- PrintStackTrace (); bunun yerine bir kaydedici çağrısı kullanın.
Bu ne anlama geliyor?
Uygulamamda, kodumu PMD üzerinden çalıştırıyorum, bana şu mesajı gösteriyor:
- PrintStackTrace (); bunun yerine bir kaydedici çağrısı kullanın.
Bu ne anlama geliyor?
Yanıtlar:
Bu, günlük çerçevesini aşağıdaki gibi kullanmanız gerektiği anlamına gelir: yeniden giriş yap veya log4j ve istisnaları doğrudan yazdırmak yerine:
e.printStackTrace();
bu çerçevelerin API'sini kullanarak bunları günlüğe kaydetmelisiniz:
log.error("Ops!", e);
Günlüğe kaydetme çerçeveleri size çok fazla esneklik sağlar, örneğin konsolda mı yoksa dosyada mı oturum açmak istediğinizi seçebilir veya bazı ortamlarda artık alakalı olmadığını düşünürseniz bazı mesajları atlayabilirsiniz.
Bir printStackTrace()
istisnayı çağırırsanız , iz yazılır System.err
ve onu başka bir yere yönlendirmek (veya filtrelemek) zordur. Bunu yapmak yerine, bir günlükleme çerçevesi (veya Apache Commons Logging gibi birden çok günlük çerçevesi etrafında bir sarmalayıcı) kullanmanız ve bu çerçeveyi kullanarak istisnayı günlüğe kaydetmeniz önerilir (örn.logger.error("some exception message", e)
).
Bunu yapmak şunları yapmanızı sağlar:
Bir üretim kalitesi programı, hataları ve diğer teşhisleri bildirmek için birçok günlük alternatiflerinden birini (örn. Log4j, logback, java.util.logging) kullanmalıdır. Bunun birçok avantajı vardır:
Bunun aksine, sadece printStackTrace kullanırsanız, konuşlandırıcı / son kullanıcı çok az kontrole sahip olur ve günlük mesajları, uygunsuz durumlarda kaybolabilir veya son kullanıcıya gösterilebilir. (Ve hiçbir şey çekingen bir kullanıcıyı rastgele bir yığın izlemeden daha fazla korkutamaz.)
Hemen hemen her kayıt çerçevesi, atılabilir nesneyi bir mesajla birlikte iletebileceğimiz bir yöntem sağlar. Sevmek:
public trace(Marker marker, String msg, Throwable t);
Fırlatılabilir nesnenin yığın izini yazdırırlar.
Şirket konseptinden konuşalım. Günlük size esnek seviyeler sunar (bkz . Logger.info ve logger.debug arasındaki fark ). Farklı insanlar, QA'lar, geliştiriciler, iş adamları gibi farklı seviyeleri görmek ister. Ancak e.printStackTrace () her şeyi yazdıracaktır. Ayrıca, bu yöntem dinlendirici çağrılacaksa, aynı hata birkaç kez yazdırılabilir. O zaman şirketinizdeki Devops veya Tech-Ops çalışanları aynı hata hatırlatıcılarını alacakları için deli olabilir. Sanırım daha iyi bir yedek olabilir log.error("errors happend in XXX", e)
Bu aynı zamanda e.printStackTrace () 'den daha kolay okunabilen tüm bilgileri yazdıracaktır
Bunun ana nedeni, Proguard'ın Log çağrılarını üretimden kaldırmasıdır. Çünkü StackTrace'i günlüğe kaydederek veya yazdırarak, bunları (yığın izleme veya Günlük içindeki bilgiler) Android telefonun içinde, örneğin Logcat Reader uygulamasıyla görmek mümkündür. Bu yüzden güvenlik için kötü bir uygulamadır. Ayrıca üretim sırasında onlara ulaşmıyoruz, üretimden çıkarılsak daha iyi olur. ProGuard, stackTrace dışındaki tüm Günlük çağrılarını kaldırdığından, Oturum açma yakalama bloklarını kullanmak ve bunların Proguard tarafından Üretimden kaldırılmasına izin vermek daha iyidir.