Di Java, apakah ada cara untuk mendapatkan (menangkap) semua exceptions
daripada menangkap pengecualian satu per satu?
Di Java, apakah ada cara untuk mendapatkan (menangkap) semua exceptions
daripada menangkap pengecualian satu per satu?
Jawaban:
Jika mau, Anda dapat menambahkan klausul lemparan ke metode Anda. Maka Anda tidak perlu langsung menemukan metode yang dicentang. Dengan begitu, Anda bisa menangkapnya exceptions
nanti (mungkin pada saat bersamaan exceptions
).
Kode tersebut terlihat seperti:
public void someMethode() throws SomeCheckedException {
// code
}
Kemudian nanti Anda dapat menangani exceptions
jika Anda tidak ingin berurusan dengan mereka dengan metode itu.
Untuk menangkap semua pengecualian yang mungkin dilemparkan beberapa blok kode, Anda dapat melakukannya: (Ini juga akan membuat Exceptions
Anda menulis sendiri)
try {
// exceptional block of code ...
// ...
} catch (Exception e){
// Deal with e as you please.
//e may be any type of exception at all.
}
Alasan yang berhasil adalah karena Exception
merupakan kelas dasar untuk semua pengecualian. Jadi setiap pengecualian yang mungkin terlempar adalah Exception
(Huruf Besar 'E').
Jika Anda ingin menangani pengecualian Anda sendiri terlebih dahulu, cukup tambahkan satu catch
blok sebelum Exception generik.
try{
}catch(MyOwnException me){
}catch(Exception e){
}
Meskipun saya setuju itu bukan gaya yang baik untuk menangkap Pengecualian mentah, ada cara menangani pengecualian yang menyediakan pencatatan yang unggul, dan kemampuan untuk menangani hal yang tidak terduga. Karena Anda berada dalam keadaan luar biasa, Anda mungkin lebih tertarik untuk mendapatkan informasi yang baik daripada waktu respons, jadi kinerja instance tidak boleh menjadi hit besar.
try{
// IO code
} catch (Exception e){
if(e instanceof IOException){
// handle this exception type
} else if (e instanceof AnotherExceptionType){
//handle this one
} else {
// We didn't expect this one. What could it be? Let's log it, and let it bubble up the hierarchy.
throw e;
}
}
Namun, ini tidak mempertimbangkan fakta bahwa IO juga dapat memunculkan Error. Kesalahan bukanlah Pengecualian. Error berada di bawah hierarki pewarisan yang berbeda dari Pengecualian, meskipun keduanya berbagi kelas dasar Throwable. Karena IO dapat menampilkan Kesalahan, Anda mungkin ingin melangkah lebih jauh untuk menangkap Throwable
try{
// IO code
} catch (Throwable t){
if(t instanceof Exception){
if(t instanceof IOException){
// handle this exception type
} else if (t instanceof AnotherExceptionType){
//handle this one
} else {
// We didn't expect this Exception. What could it be? Let's log it, and let it bubble up the hierarchy.
}
} else if (t instanceof Error){
if(t instanceof IOError){
// handle this Error
} else if (t instanceof AnotherError){
//handle different Error
} else {
// We didn't expect this Error. What could it be? Let's log it, and let it bubble up the hierarchy.
}
} else {
// This should never be reached, unless you have subclassed Throwable for your own purposes.
throw t;
}
}
Tangkap pengecualian dasar 'Pengecualian'
try {
//some code
} catch (Exception e) {
//catches exception and all subclasses
}
Menangkap Exception merupakan praktik yang buruk - terlalu luas, dan Anda mungkin melewatkan sesuatu seperti NullPointerException dalam kode Anda sendiri.
Untuk sebagian besar operasi file, IOException adalah pengecualian root. Lebih baik tangkap itu.
Ya ada.
try
{
//Read/write file
}catch(Exception ex)
{
//catches all exceptions extended from Exception (which is everything)
}
Anda dapat menangkap beberapa pengecualian dalam satu blok tangkapan.
try{
// somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
// handle exception.
}
Apakah maksud Anda menangkap jenisException
apa pun yang dibuang, bukan hanya Pengecualian tertentu?
Jika begitu:
try {
//...file IO...
} catch(Exception e) {
//...do stuff with e, such as check its type or log it...
}