Dalam aplikasi saya, saya menjalankan kode saya melalui PMD. Ini menunjukkan kepada saya pesan ini:
- Hindari printStackTrace (); gunakan panggilan logger sebagai gantinya.
Apa artinya?
Dalam aplikasi saya, saya menjalankan kode saya melalui PMD. Ini menunjukkan kepada saya pesan ini:
- Hindari printStackTrace (); gunakan panggilan logger sebagai gantinya.
Apa artinya?
Jawaban:
Ini berarti Anda harus menggunakan kerangka kerja logging seperti logback atau log4j dan alih-alih mencetak pengecualian secara langsung:
e.printStackTrace();
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.
Jika Anda memanggil printStackTrace()
pengecualian, pelacakan akan ditulis System.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 (misalnya logger.error("some exception message", e)
).
Melakukan itu memungkinkan Anda untuk:
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.)
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.
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 ()
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.