Di Jawa, saya ingin melakukan sesuatu seperti ini:
try {
...
} catch (/* code to catch IllegalArgumentException, SecurityException,
IllegalAccessException, and NoSuchFieldException at the same time */) {
someCode();
}
...dari pada:
try {
...
} catch (IllegalArgumentException e) {
someCode();
} catch (SecurityException e) {
someCode();
} catch (IllegalAccessException e) {
someCode();
} catch (NoSuchFieldException e) {
someCode();
}
Apakah ada cara untuk melakukan ini?
java
exception
try-catch
multi-catch
froadie
sumber
sumber
bitwise or
(|
)? Mengapa tidak menggunakan koma, atau operator yang memiliki makna yang lebih mirip, yaitulogical or
(||
)?Tidak persis sebelum Java 7 tetapi, saya akan melakukan sesuatu seperti ini:
Java 6 dan sebelumnya
Java 7
sumber
exc.getCause()
. Sebagai catatan tambahan, Robert C. Martin (antara lain) merekomendasikan untuk menggunakan pengecualian yang tidak dicentang (kompiler tidak tahu jenis pengecualian apa yang akan dilemparkan dari sana); lihat Bab 7: Penanganan Kesalahan pada bukunya Kode bersih .throw exc
bukanthrow new RuntimeException(exc)
?Dalam Java 7 Anda dapat mendefinisikan beberapa klausa tangkapan seperti:
sumber
Jika ada hierarki pengecualian, Anda bisa menggunakan kelas dasar untuk menangkap semua subkelas pengecualian. Dalam kasus degenerasi Anda dapat menangkap semua pengecualian Java dengan:
Dalam kasus yang lebih umum jika RepositoryException adalah kelas dasar dan PathNotFoundException adalah kelas turunan maka:
Kode di atas akan menangkap RepositoryException dan PathNotFoundException untuk satu jenis penanganan pengecualian dan semua pengecualian lainnya disatukan. Sejak Java 7, sesuai jawaban @ OscarRyz di atas:
sumber
Tidak, satu per pelanggan.
Anda dapat menangkap superclass, seperti java.lang.Exception, selama Anda melakukan tindakan yang sama dalam semua kasus.
Tapi itu mungkin bukan praktik terbaik. Anda seharusnya hanya menangkap pengecualian ketika Anda memiliki strategi untuk benar-benar menanganinya - dan logging dan rethrowing bukan "menanganinya". Jika Anda tidak memiliki tindakan korektif, lebih baik menambahkannya ke tanda tangan metode dan membiarkannya menggelembung ke seseorang yang dapat menangani situasi tersebut.
sumber
Alternatif yang lebih bersih (tetapi kurang bertele-tele, dan mungkin tidak seperti pilihan) untuk jawaban user454322 di Java 6 (yaitu, Android) adalah untuk menangkap semua
Exception
dan melempar kembaliRuntimeException
. Ini tidak akan berhasil jika Anda berencana untuk menangkap jenis pengecualian lain di atas tumpukan (kecuali Anda juga melemparkannya kembali), tetapi secara efektif akan menangkap semua pengecualian yang dicentang .Contohnya:
Yang sedang berkata, untuk verbosity, mungkin lebih baik untuk mengatur boolean atau variabel lain dan berdasarkan itu jalankan beberapa kode setelah blok try-catch.
sumber
Di pra-7 bagaimana dengan:
sumber
caught
dalam sebuahfinally
blok?Iya. Inilah cara menggunakan pemisah pipa (|),
sumber
Untuk kotlin, itu tidak mungkin untuk saat ini tetapi mereka telah mempertimbangkan untuk menambahkannya: Sumber
Tapi untuk saat ini, hanya sedikit trik:
sumber
Tangkap pengecualian yang kebetulan menjadi kelas induk dalam hierarki pengecualian. Ini tentu saja, praktik buruk . Dalam kasus Anda, pengecualian orang tua yang umum terjadi adalah kelas Pengecualian, dan menangkap setiap pengecualian yang merupakan contoh Pengecualian, memang praktik yang buruk - pengecualian seperti NullPointerException biasanya kesalahan pemrograman dan biasanya harus diselesaikan dengan memeriksa nilai nol.
sumber