Sebagian besar waktu saya akan menggunakan pengecualian untuk memeriksa kondisi dalam kode saya, saya bertanya-tanya kapan waktu yang tepat untuk menggunakan pernyataan?
Misalnya,
Group group=null;
try{
group = service().getGroup("abc");
}catch(Exception e){
//I dont log error because I know whenever error occur mean group not found
}
if(group !=null)
{
//do something
}
Bisakah Anda menunjukkan bagaimana pernyataan cocok di sini? Haruskah saya menggunakan pernyataan?
Sepertinya saya tidak pernah menggunakan pernyataan dalam kode produksi dan hanya melihat pernyataan dalam pengujian unit. Saya tahu bahwa dalam banyak kasus, saya hanya dapat menggunakan pengecualian untuk melakukan pemeriksaan seperti di atas, tetapi saya ingin tahu cara yang tepat untuk melakukannya "secara profesional".
Keluar dari pikiran saya (daftar mungkin tidak lengkap, dan terlalu panjang untuk memuat komentar), saya akan mengatakan:
Dengan kata lain, pengecualian menangani ketahanan aplikasi Anda sementara pernyataan membahas kebenarannya.
Assertion dirancang agar murah untuk ditulis, Anda dapat menggunakannya hampir di mana saja dan saya menggunakan aturan praktis ini: semakin pernyataan pernyataan terlihat bodoh, semakin berharga dan semakin banyak informasi yang disematkan. Saat men-debug program yang berperilaku tidak benar, Anda pasti akan memeriksa kemungkinan kegagalan yang lebih jelas berdasarkan pengalaman Anda. Kemudian Anda akan memeriksa masalah yang tidak dapat terjadi: ini tepatnya ketika pernyataan sangat membantu dan menghemat waktu.
sumber
Ingat pernyataan dapat dinonaktifkan saat runtime menggunakan parameter, dan dinonaktifkan secara default , jadi jangan mengandalkannya kecuali untuk tujuan debugging.
Anda juga harus membaca artikel Oracle tentang assert untuk melihat lebih banyak kasus di mana menggunakan - atau tidak menggunakan - assert.
sumber
Sebagai aturan umum:
java
perintah mematikan semua pernyataan secara default.)Kode berikut dari pertanyaan Anda adalah gaya yang buruk dan berpotensi bermasalah
Masalahnya adalah Anda TIDAK tahu bahwa pengecualian berarti grup tidak ditemukan. Mungkin juga
service()
panggilan tersebut melontarkan pengecualian, atau muncul kembalinull
yang kemudian menyebabkan aNullPointerException
.Saat Anda menemukan pengecualian "yang diharapkan", Anda harus menangkap hanya pengecualian yang Anda harapkan. Dengan menangkap
java.lang.Exception
(dan terutama dengan tidak mencatatnya), Anda mempersulit untuk mendiagnosis / men-debug masalah, dan berpotensi memungkinkan aplikasi melakukan lebih banyak kerusakan.sumber
Nah, kembali ke Microsoft, rekomendasinya adalah untuk membuang Pengecualian di semua API yang Anda sediakan untuk umum dan menggunakan Asserts dalam segala macam asumsi yang Anda buat tentang kode yang bersifat internal. Ini sedikit definisi yang longgar tetapi saya kira itu tergantung pada masing-masing pengembang untuk menarik garis.
Mengenai penggunaan Pengecualian, seperti namanya, penggunaannya harus luar biasa sehingga untuk kode yang Anda tunjukkan di atas,
getGroup
panggilan akan ditampilkannull
jika tidak ada layanan. Pengecualian seharusnya hanya terjadi jika tautan jaringan mati atau semacamnya.Saya kira kesimpulannya adalah bahwa itu sedikit diserahkan kepada tim pengembangan untuk setiap aplikasi untuk menentukan batas-batas pernyataan vs pengecualian.
sumber
Menurut dokumen ini http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#design-faq-general , "Pernyataan tegas sesuai untuk prasyarat nonpublik, kondisi pascakondisi, dan invarian kelas pemeriksaan. Pemeriksaan prakondisi publik harus tetap dilakukan dengan pemeriksaan di dalam metode yang menghasilkan pengecualian terdokumentasi tertentu, seperti IllegalArgumentException dan IllegalStateException. "
Jika Anda ingin mengetahui lebih banyak tentang prekondisi, kondisi pos dan invarian kelas, periksa dokumen ini: http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#usage-conditions . Ini juga berisi contoh penggunaan pernyataan.
sumber
Menguji null hanya akan menangkap null yang menyebabkan masalah, sedangkan coba / tangkap seperti yang Anda lakukan akan mendeteksi error apa pun .
Secara umum, coba / tangkap lebih aman, tetapi sedikit lebih lambat, dan Anda harus berhati-hati agar menangkap semua jenis kesalahan yang mungkin terjadi. Jadi saya akan mengatakan gunakan try / catch - suatu hari kode getGroup dapat berubah, dan Anda mungkin membutuhkan jaring yang lebih besar itu.
sumber
Anda dapat menggunakan perbedaan sederhana ini dalam pikiran saat menggunakannya. Pengecualian akan digunakan untuk memeriksa kesalahan yang diharapkan dan tidak terduga yang disebut kesalahan diperiksa dan tidak dicentang sementara pernyataan digunakan terutama untuk tujuan debugging pada waktu proses untuk melihat apakah asumsi divalidasi atau tidak.
sumber
Saya akui saya agak bingung dengan pertanyaan Anda. Jika kondisi pernyataan tidak terpenuhi, pengecualian akan dilemparkan. Yang membingungkan, ini disebut AssertionError . Perhatikan bahwa ini tidak dicentang, seperti (misalnya) IllegalArgumentException yang muncul dalam keadaan yang sangat mirip.
Jadi menggunakan pernyataan di Java
sumber
Lihat bagian 6.1.2 (Pernyataan vs. kode kesalahan lainnya) dari dokumentasi Sun di tautan berikut.
http://www.oracle.com/technetwork/articles/javase/javapch06.pdf
Dokumen ini memberikan saran terbaik yang pernah saya lihat tentang kapan harus menggunakan pernyataan. Mengutip dari dokumen:
"Aturan praktis yang baik adalah Anda harus menggunakan pernyataan untuk kasus luar biasa yang ingin Anda lupakan. Penegasan adalah cara tercepat untuk menangani, dan melupakan, suatu kondisi atau keadaan yang tidak Anda harapkan akan terjadi. berurusan dengan."
sumber
Sayangnya menegaskan dapat dinonaktifkan. Saat dalam produksi, Anda membutuhkan semua bantuan yang bisa Anda peroleh saat melacak sesuatu yang tidak terduga, jadi tegas mendiskualifikasi diri.
sumber