Terkadang, saya mengerti
try {
} catch(Throwable e) {
}
Dan terkadang
try {
} catch(Exception e) {
}
Apa bedanya?
Terkadang, saya mengerti
try {
} catch(Throwable e) {
}
Dan terkadang
try {
} catch(Exception e) {
}
Apa bedanya?
Jawaban:
Dengan menangkap Throwable
itu termasuk hal-hal yang subclass Error
. Anda umumnya tidak boleh melakukan itu, kecuali mungkin pada tingkatan "tangkap semua" yang paling tinggi di mana Anda ingin masuk atau menangani sepenuhnya semua yang dapat salah. Ini akan lebih khas dalam aplikasi jenis kerangka kerja (misalnya server aplikasi atau kerangka kerja pengujian) di mana ia dapat menjalankan kode yang tidak dikenal dan tidak boleh dipengaruhi oleh apa pun yang salah dengan kode itu, sebanyak mungkin.
throw new Throwable();
, jadi itu adalah satu-satunya cara untuk benar-benar menangkap semuanya.
Yang pertama menangkap semua subclass dari Throwable
(ini termasuk Exception
dan Error
), yang kedua menangkap semua subclass dari Exception
.
Error
secara terprogram tidak dapat dipulihkan dengan cara apa pun dan biasanya tidak ditangkap, kecuali untuk tujuan logging (yang melewatinya lagi). Exception
terprogram dapat dipulihkan. Subkelasnya RuntimeException
menunjukkan kesalahan pemrograman dan biasanya tidak ditangkap juga.
Error
dan 2) Kecuali jika ada pencatatan, Anda mungkin tidak pernah diberi tahu bahwa OOM terjadi, membuat Anda bertanya-tanya mengapa server mulai berperilaku "lucu"
programmatically unrecoverable
sebenarnya yang dimaksud? Apakah ini sangat parah, sehingga pada dasarnya kita tidak dapat memanggil metode Java APA SAJA setelah menangkapnya lagi (logging, dll) tanpa kesempatan untuk mendapatkan perilaku yang tidak terduga dari JVM sebagai hasilnya?
Its subclass RuntimeException indicates a programming error
: Tidak yakin apakah saya setuju dengan pernyataan ini. Jika itu benar, itu berarti semua pengecualian yang diharapkan harus diperiksa pengecualian. Bagaimana jika saya mengharapkan sesuatu mungkin gagal dan tidak dapat dipulihkan oleh aplikasi saya, tetapi saya ingin setidaknya melemparkan pengecualian yang bermakna? Menggunakan pengecualian yang diperiksa dalam kasus itu tampaknya tidak berguna dan membuat kode boilerplate.
Thowable
benar-benar menangkap semuanya, bahkan ThreadDeath yang dilemparkan secara default untuk menghentikan utas dari metode yang sekarang tidak Thread.stop()
digunakan lagi . Jadi dengan menangkap Throwable
Anda dapat yakin bahwa Anda tidak akan pernah meninggalkan blok percobaan tanpa setidaknya melewati blok tangkapan Anda, tetapi Anda harus siap untuk juga menangani OutOfMemoryError
dan InternalError
atau StackOverflowError
.
Menangkap Throwable
sangat berguna untuk loop server luar yang mendelegasikan semua jenis permintaan ke kode luar tetapi mungkin sendiri tidak pernah berakhir untuk menjaga layanan tetap hidup.
Throwable
adalah kelas super Exception
juga Error
. Dalam kasus normal kita harus selalu menangkap sub-kelasException
, sehingga akar permasalahan tidak hilang.
Hanya kasus khusus di mana Anda melihat kemungkinan kesalahan terjadi yang tidak dapat mengontrol kode Java Anda, Anda harus menangkap Error
atau Throwable
.
Saya ingat menangkap Throwable untuk menandai bahwa perpustakaan asli tidak dimuat.