3. Pengecualian pembalut

Pengecualian yang disemak kelihatan hebat dalam teori, tetapi ternyata menjadi kekecewaan yang besar dalam amalan.

Katakan anda mempunyai kaedah yang sangat popular dalam projek anda. Ia dipanggil dari ratusan tempat dalam program anda. Dan anda memutuskan untuk menambah pengecualian baru yang ditandakan padanya. Dan mungkin pengecualian yang disemak ini benar-benar penting dan sangat istimewa sehingga hanya main()kaedah yang tahu apa yang perlu dilakukan jika ia ditangkap.

Ini bermakna anda perlu menambah pengecualian yang ditandakan pada throwsklausa setiap kaedah yang memanggil kaedah super popular anda . Begitu juga dalam throwsklausa semua kaedah yang memanggil kaedah tersebut. Dan kaedah yang memanggil kaedah tersebut.

Akibatnya, throwsklausa separuh daripada kaedah dalam projek mendapat pengecualian diperiksa baharu . Dan sudah tentu projek anda dilindungi oleh ujian, dan kini ujian tidak disusun. Dan kini anda perlu mengedit klausa lontaran dalam ujian anda juga.

Dan kemudian semua kod anda (semua perubahan dalam ratusan fail) perlu disemak oleh pengaturcara lain. Dan pada ketika ini kami bertanya kepada diri sendiri mengapa kami membuat banyak perubahan berdarah pada projek itu? Hari bekerja dan ujian yang rosak — semuanya demi menambah satu pengecualian yang telah ditandakan ?

Dan sudah tentu, masih terdapat masalah yang berkaitan dengan pewarisan dan kaedah mengatasi. Masalah yang datang daripada pengecualian yang disemak adalah lebih besar daripada manfaatnya. Intinya ialah kini hanya sedikit orang yang menyukainya dan hanya sedikit orang yang menggunakannya.

Walau bagaimanapun, masih terdapat banyak kod (termasuk kod perpustakaan Java standard) yang mengandungi pengecualian yang disemak ini . Apa yang perlu dilakukan dengan mereka? Kita tidak boleh mengabaikan mereka, dan kita tidak tahu bagaimana untuk mengendalikannya.

Pengaturcara Java mencadangkan untuk membungkus pengecualian yang diperiksa dalam RuntimeException. Dalam erti kata lain, tangkap semua pengecualian yang ditandakan dan kemudian buat pengecualian yang tidak ditandakan (contohnya, RuntimeException) dan buangnya. Melakukannya kelihatan seperti ini:

try
{
   // Code where a checked exception might occur
}
catch(Exception exp)
{
   throw new RuntimeException(exp);
}

Ia bukan penyelesaian yang sangat cantik, tetapi tiada apa-apa jenayah di sini: pengecualian hanya disumbat di dalam RuntimeException.

Jika dikehendaki, anda boleh mendapatkannya dengan mudah dari sana. Contoh:

Kod Catatan
try
{
   // Code where we wrap the checked exception
   // in a RuntimeException
}
catch(RuntimeException e)
{
   Throwable cause = e.getCause();
   if (cause instanceof Exception)
   {
      Exception exp = (Exception) cause;
      // Exception handling code goes here
   }
}







Dapatkan pengecualian yang disimpan di dalam RuntimeExceptionobjek. Pembolehubah causemungkin null

Tentukan jenisnya dan tukarkannya kepada jenis pengecualian yang diperiksa .