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 Throwableitu 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 Exceptiondan 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). Exceptionterprogram dapat dipulihkan. Subkelasnya RuntimeExceptionmenunjukkan kesalahan pemrograman dan biasanya tidak ditangkap juga.
Errordan 2) Kecuali jika ada pencatatan, Anda mungkin tidak pernah diberi tahu bahwa OOM terjadi, membuat Anda bertanya-tanya mengapa server mulai berperilaku "lucu"
programmatically unrecoverablesebenarnya 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.
Thowablebenar-benar menangkap semuanya, bahkan ThreadDeath yang dilemparkan secara default untuk menghentikan utas dari metode yang sekarang tidak Thread.stop()digunakan lagi . Jadi dengan menangkap ThrowableAnda dapat yakin bahwa Anda tidak akan pernah meninggalkan blok percobaan tanpa setidaknya melewati blok tangkapan Anda, tetapi Anda harus siap untuk juga menangani OutOfMemoryErrordan InternalErroratau StackOverflowError.
Menangkap Throwablesangat berguna untuk loop server luar yang mendelegasikan semua jenis permintaan ke kode luar tetapi mungkin sendiri tidak pernah berakhir untuk menjaga layanan tetap hidup.
Throwableadalah kelas super Exceptionjuga 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 Erroratau Throwable.
Saya ingat menangkap Throwable untuk menandai bahwa perpustakaan asli tidak dimuat.