Bagaimana saya bisa menangkap semua pengecualian yang akan diberikan melalui membaca dan menulis file?


105

Di Java, apakah ada cara untuk mendapatkan (menangkap) semua exceptionsdaripada menangkap pengecualian satu per satu?


2
dan saya akan menangkap semua Pengecualian spesifik itu dengan tangkapan (Pengecualian e) {} ??
Johanna

ya. Karena Exception adalah kelas dasar dari semua pengecualian, itu akan menangkap semua pengecualian.
jjnguy

1
@ jjnguy: terima kasih atas penjelasannya yang bagus.
Johanna

Saya senang ini membantu.
jjnguy

Jawaban:


111

Jika mau, Anda dapat menambahkan klausul lemparan ke metode Anda. Maka Anda tidak perlu langsung menemukan metode yang dicentang. Dengan begitu, Anda bisa menangkapnya exceptionsnanti (mungkin pada saat bersamaan exceptions).

Kode tersebut terlihat seperti:

public void someMethode() throws SomeCheckedException {

    //  code

}

Kemudian nanti Anda dapat menangani exceptionsjika 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 ExceptionsAnda 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 Exceptionmerupakan 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 catchblok sebelum Exception generik.

try{    
}catch(MyOwnException me){
}catch(Exception e){
}

95

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;
    }
}

12
Mengapa tidak menggunakan beberapa blok tangkapan?
Carl G

1
Saya berpendapat bahwa Anda harus menangkap setiap pengecualian secara eksplisit, tetapi pertanyaannya secara eksplisit menanyakan bagaimana menangkap semua yang akan dilemparkan oleh blok kode.
codethulhu

Lemparan itu berguna.
Anshul

Ini adalah solusi yang saya cari, saya memerlukan penanganan pengecualian. Terima kasih
CubeJockey

Tip yang bisa dibuang sangat berguna.
cherryhitech

15

Tangkap pengecualian dasar 'Pengecualian'

   try { 
         //some code
   } catch (Exception e) {
        //catches exception and all subclasses 
   }

8
Jika Anda menulis kode ini, Anda hampir pasti melakukan sesuatu yang sangat salah.
George

2
@ George Mengapa Anda mengatakan itu?
kuchi

10
@George Belum tentu, jika Anda berurusan dengan sesuatu yang memiliki banyak parameter entri sensitif dan sangat rumit untuk memverifikasi validitas masing-masing, menangkap semua jenis pengecualian setelah kasus yang berfungsi diuji dengan benar adalah cara yang tepat. . Ini akan membuat kode jelas dan jauh lebih mindf * k daripada kondisi yang besar dan berpotensi berat.
Johnride

2
Kebanyakan pembuat kode yang pernah bekerja dengan saya tidak memasukkan apa pun ke dalam pernyataan tangkap mereka, jadi menggunakan cuplikan coba tangkap ini sebenarnya lebih baik daripada menangkap sekumpulan jenis pengecualian yang berbeda dan tidak melakukan apa pun dengannya
Lou Morda

1
@LouisMorda Saya tidak setuju, menangkap setiap subkelas Pengecualian dan tidak melakukan apa pun berdasarkan mereka (mengabaikannya) lebih buruk daripada hanya menangkap beberapa pengecualian tertentu dan mengabaikannya. Jika Anda menangkap beberapa jenis Pengecualian dan tidak melakukan apa pun dengan informasinya, Anda tidak memiliki kesempatan untuk mengetahui apa yang salah dalam situasi tersebut, tetapi jika Anda menangkap semua subkelas Pengecualian, Anda tidak memiliki kesempatan untuk mengetahui apa yang salah dalam jumlah besar situasi. Pertimbangkan bagaimana Anda akan menangani laporan bug tanpa informasi dari pengecualian, seperti stacktraces dan pesan.
z

6

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.


1
Menangkap Exception adalah praktik yang buruk. Mengapa? suara negatif dijelaskan buruk
Pedro Sequeira

4

Ya ada.

try
{
    //Read/write file
}catch(Exception ex)
{
    //catches all exceptions extended from Exception (which is everything)
}

4

Anda dapat menangkap beberapa pengecualian dalam satu blok tangkapan.

try{
  // somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
  // handle exception.
} 

3

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...
}

Apa yang harus saya lakukan untuk yang tidak spesifik ??
Johanna

dan saya akan menangkap semua Pengecualian spesifik itu dengan tangkapan (Pengecualian e) {} ??
Johanna
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.