Saya sedang mengerjakan aplikasi Java, dan saya melihat bahwa Run time exception ditangani di banyak tempat. Sebagai contoh,
try {
// do something
} catch(NullPointerException e) {
return null;
}
Pertanyaan saya adalah, kapan itu praktik yang baik untuk menangani pengecualian Runtime? Kapan pengecualian harus dibiarkan tidak tertangani?
java
exceptions
Vinoth Kumar CM
sumber
sumber
Jawaban:
Tergantung.
Misalnya,
Integer#parseInt
melemparNumberFormatException
(yang merupakan RTE) jika string yang disediakan tidak dapat diuraikan. Tetapi tentunya Anda tidak ingin aplikasi Anda mogok hanya karena pengguna menulis "x" ke bidang teks yang untuk bilangan bulat? Dan bagaimana Anda tahu apakah string dapat diuraikan, kecuali jika Anda mencoba menguraikannya terlebih dahulu? Jadi dalam hal ini, RTE hanyalah sinyal kesalahan yang seharusnya menyebabkan beberapa jenis pesan kesalahan. Orang bisa berargumen bahwa itu harus menjadi pengecualian yang diperiksa, tetapi apa yang bisa Anda lakukan - tidak.sumber
Integer#parseInt
harus benar-benar mengembalikanMaybe<Integer>
gantinya dan tidak membuang pengecualian sama sekali.NullPointerExceptions biasanya merupakan tanda dari cek nol yang hilang. Jadi, alih-alih menangkapnya seperti ini, Anda harus menambahkan tanda centang nol yang sesuai untuk memastikan tidak membuang pengecualian.
Tetapi kadang-kadang, sangat tepat untuk menangani RunTimeExceptions. Misalnya, ketika Anda tidak dapat mengubah kode untuk menambahkan cek nol di tempat yang sesuai, atau ketika pengecualian adalah sesuatu selain NullPointerException.
Contoh Anda dalam menangani pengecualian sangat buruk. Dengan melakukannya, Anda kehilangan jejak tumpukan dan informasi yang tepat tentang masalah tersebut. Dan Anda sebenarnya tidak menyelesaikannya karena Anda mungkin akan memicu NullPointerException lain di tempat yang berbeda, dan mendapatkan informasi yang menyesatkan tentang apa yang terjadi dan bagaimana menyelesaikannya.
sumber
return null;
) akan menjadi solusi yang lebih baik.new
melemparstd::bad_alloc
dalam C ++.Saya menangani pengecualian yang diharapkan di mana saya mengharapkannya. (Seperti kesalahan baca / tulis DB). Pengecualian yang tidak terduga saya muncul. Di tempat lain mungkin mengharapkan pengecualian dan memiliki logika untuk itu.
sumber
Pengecualian harus hanya itu .. pengecualian. Praktik terbaik ketika menggunakan pengecualian adalah menggunakannya untuk mencakup situasi di mana sesuatu yang bertentangan dengan apa yang Anda harapkan terjadi terjadi. Contoh klasik adalah FileNotFoundException yang dilemparkan ketika file tidak ada di sana. Jika Anda menguji keberadaan file, maka Anda menggunakan File.exists () karena Anda hanya mendorong dengan tongkat 10 kaki untuk melihat apakah Anda menabrak sesuatu.
Anda dapat secara teknis mencapai hasil yang sama dengan mengelilinginya dalam mencoba menangkap dan menggunakan file seolah-olah ada, tetapi A) pengecualian umumnya mahal sumber daya dan B) programmer akan menganggap Anda berarti file itu ada jika itu ada dalam try catch, yang menambah kebingungan keseluruhan suatu program.
Ada banyak situasi di mana saya akan menulis metode yang mengambil beberapa nilai dari database. Seribu hal bisa salah, dan melihat betapa saya hanya membutuhkan satu informasi kecil, tidak nyaman untuk mengelilingi panggilan dengan daftar coba coba yang berisi 5 pengecualian berbeda. Jadi, saya akan menangkap pengecualian dalam metode pengambilan. Jika terjadi kesalahan, saya mengambil tindakan apa pun yang sesuai untuk menutup koneksi database atau yang lainnya di klausa akhirnya dan mengembalikan nol. Ini adalah praktik yang baik tidak hanya karena menyederhanakan kode Anda tetapi juga karena "null" mengirim pesan yang sama dengan yang Anda dapatkan dari pengecualian .. bahwa ada sesuatu yang tidak berjalan sesuai rencana. Kelola spesifik pengecualian dalam metode pengambilan, tetapi kelola apa yang harus dilakukan ketika hal-hal tidak terjadi
Sebagai contoh:
sumber
ya Anda benar menangani pengecualian run time bukan praktik yang baik. Alasannya adalah bahwa itu dianggap mahal / memori intensif.
sumber