Dalam aplikasi saya, saya menjalankan kode saya melalui PMD. Ini menunjukkan kepada saya pesan ini:
- Hindari printStackTrace (); gunakan panggilan logger sebagai gantinya.
Apa artinya?
java
logging
pmd
printstacktrace
pengguna1305398
sumber
sumber
Jawaban:
Ini berarti Anda harus menggunakan kerangka kerja logging seperti logback atau log4j dan alih-alih mencetak pengecualian secara langsung:
Anda harus mencatatnya menggunakan API kerangka kerja ini:
log.error("Ops!", e);
Kerangka kerja pencatatan memberi Anda banyak fleksibilitas, misalnya Anda dapat memilih apakah Anda ingin masuk ke konsol atau file - atau mungkin melewatkan beberapa pesan jika Anda merasa tidak lagi relevan di beberapa lingkungan.
sumber
Jika Anda memanggil
printStackTrace()
pengecualian, pelacakan akan ditulisSystem.err
dan sulit untuk merutekannya ke tempat lain (atau memfilternya). Alih-alih melakukan ini, Anda disarankan untuk menggunakan kerangka kerja logging (atau pembungkus di sekitar beberapa kerangka kerja logging, seperti Apache Commons Logging) dan mencatat pengecualian menggunakan kerangka itu (misalnyalogger.error("some exception message", e)
).Melakukan itu memungkinkan Anda untuk:
sumber
Program kualitas produksi harus menggunakan salah satu dari banyak alternatif pencatatan (misalnya log4j, logback, java.util.logging) untuk melaporkan kesalahan dan diagnostik lainnya. Ini memiliki sejumlah keuntungan:
Sebaliknya, jika Anda hanya menggunakan printStackTrace, deployer / pengguna akhir memiliki sedikit kontrol jika ada, dan pesan pencatatan dapat hilang atau ditampilkan kepada pengguna akhir dalam keadaan yang tidak tepat. (Dan tidak ada yang lebih menakutkan bagi pengguna yang pemalu selain pelacakan tumpukan acak.)
sumber
Dalam Simple, e.printStackTrace () bukanlah praktik yang baik, karena hanya mencetak jejak tumpukan ke kesalahan standar. Karena itu, Anda tidak dapat benar-benar mengontrol kemana arah keluaran ini.
sumber
Hampir setiap kerangka kerja logging menyediakan metode di mana kita bisa meneruskan objek yang bisa dibuang bersama dengan pesan. Suka:
public trace(Marker marker, String msg, Throwable t);
Mereka mencetak pelacakan tumpukan dari objek yang dapat dibuang.
sumber
Mari kita bicara dari konsep perusahaan. Log memberi Anda level yang fleksibel (lihat Perbedaan antara logger.info dan logger.debug ). Orang yang berbeda ingin melihat level yang berbeda, seperti QA, pengembang, pebisnis. Tapi e.printStackTrace () akan mencetak semuanya. Juga, seperti jika metode ini akan disebut restful, kesalahan yang sama ini dapat dicetak beberapa kali. Maka orang Devops atau Tech-Ops di perusahaan Anda mungkin gila karena mereka akan menerima pengingat kesalahan yang sama. Saya pikir pengganti yang lebih baik bisa jadi
log.error("errors happend in XXX", e)
Ini juga akan mencetak seluruh informasi yang mudah dibaca daripada e.printStackTrace ()sumber
Alasan utamanya adalah Proguard akan menghapus panggilan Log dari produksi. Karena dengan mencatat atau mencetak StackTrace, Anda dapat melihatnya (informasi di dalam stack trace atau Log) di dalam ponsel Android, misalnya dengan aplikasi Logcat Reader. Sehingga ini adalah praktik yang buruk untuk keamanan. Selain itu, kami tidak mengaksesnya selama produksi, akan lebih baik jika dihapus dari produksi. Karena ProGuard menghapus semua panggilan Log, bukan stackTrace, maka lebih baik menggunakan Log in catch block dan biarkan mereka dihapus dari Production by Proguard.
sumber