Ada beberapa aturan untuk penanganan pengecualian yang harus Anda ingat. Tetapi pertama-tama, Anda harus ingat bahwa pengecualian adalah bagian dari antarmuka yang diekspos oleh kode; mendokumentasikannya . Ini terutama penting ketika antarmuka adalah antarmuka publik, tentu saja, tetapi itu adalah ide yang sangat bagus di antarmuka pribadi juga.
Pengecualian hanya harus ditangani pada titik di mana kode dapat melakukan sesuatu yang masuk akal dengannya. Opsi penanganan terburuk adalah tidak melakukan apa-apa tentang mereka, yang seharusnya hanya dilakukan ketika itu adalah pilihan yang tepat. (Ketika saya memiliki situasi seperti itu dalam kode saya, saya memasukkan komentar untuk efek itu sehingga saya tahu tidak perlu khawatir tentang tubuh kosong.)
Pilihan terburuk kedua adalah melemparkan pengecualian yang tidak terkait tanpa yang asli terlampir sebagai penyebabnya. Masalahnya di sini adalah bahwa informasi dalam pengecualian asli yang akan memungkinkan diagnosis masalah hilang; Anda sedang menciptakan sesuatu yang tak dapat melakukan apa saja dengan (selain mengeluh bahwa “itu tidak bekerja”, dan kita semua tahu bagaimana kita membenci mereka laporan bug).
Jauh lebih baik adalah mencatat pengecualian. Itu memungkinkan seseorang mengetahui apa masalahnya dan memperbaikinya, tetapi Anda hanya harus mencatat pengecualian pada titik di mana masalah tersebut akan hilang atau dilaporkan melalui koneksi eksternal. Itu bukan karena penebangan lebih sering merupakan masalah besar, tetapi karena penebangan yang berlebihan berarti Anda hanya mendapatkan lebih banyak ruang tanpa menggunakan lebih banyak informasi. Setelah Anda mencatat pengecualian, Anda dapat melaporkan suatu précis kepada pengguna / klien dengan hati nurani yang baik (selama Anda juga menyertakan waktu pembuatan - atau pengidentifikasi korelasi lainnya - dalam laporan itu sehingga versi singkatnya dapat dicocokkan. dengan detail jika perlu).
Pilihan terbaik adalah, tentu saja, untuk sepenuhnya menangani pengecualian, berurusan dengan situasi kesalahan secara keseluruhan. Jika Anda bisa melakukan ini, lakukan saja! Bahkan mungkin berarti Anda bisa menghindari harus mencatat pengecualian.
Salah satu cara untuk menangani pengecualian adalah dengan melemparkan pengecualian lain yang menyediakan deskripsi tingkat tinggi dari masalah (misalnya, " failed to initialize
" bukannya " index out of bounds
"). Ini adalah pola yang baik selama Anda tidak kehilangan informasi tentang penyebab pengecualian; gunakan pengecualian terperinci untuk menginisialisasi cause
pengecualian tingkat lebih tinggi atau catat detailnya (seperti dibahas di atas). Logging paling tepat ketika Anda akan melewati batas antar-proses, seperti panggilan IPC, karena tidak ada jaminan bahwa kelas pengecualian level rendah akan hadir sama sekali di ujung koneksi yang lain. Menjaga sebagai penyebab terlampir adalah yang paling tepat ketika melewati batas internal.
Pola lain yang Anda lihat adalah tangkapan-dan-lepas:
try {
// ...
} catch (FooException e) {
throw e;
}
Ini adalah anti-pola kecuali Anda memiliki batasan jenis dari catch
klausa lain yang berarti Anda tidak bisa membiarkan pengecualian melewati sendiri. Maka itu hanya fitur jelek dari Java.
Tidak ada perbedaan nyata antara pengecualian yang diperiksa dan yang tidak dicentang selain fakta bahwa Anda harus menyatakan pengecualian yang diperiksa yang melintasi batas metode. Itu masih merupakan ide bagus untuk mendokumentasikan pengecualian yang tidak dicentang (dengan @throws
komentar javadoc) jika Anda tahu mereka dilemparkan dengan sengaja oleh kode Anda. Jangan dengan sengaja melempar java.lang.Error
atau subkelasnya (kecuali jika Anda sedang menulis implementasi JVM).
Opini: Kasus kesalahan tak terduga selalu mewakili bug dalam kode Anda. Pengecualian yang dicek adalah cara untuk mengelola ancaman ini, dan di mana pengembang sengaja menggunakan pengecualian yang tidak dicentang sebagai cara untuk menghindari masalah penanganan kasus kesalahan, Anda sedang membangun banyak hutang teknis yang harus Anda selesaikan beberapa waktu jika Anda ingin kode yang kuat. Penanganan kesalahan yang ceroboh tidak profesional (dan melihat penanganan kesalahan adalah cara yang baik untuk menentukan seberapa baik programmer sebenarnya).