1. Pengenalan
Dalam tutorial ini, kita akan membahas cara membuat pengecualian khusus di Java .
Kami akan menunjukkan bagaimana pengecualian yang ditentukan pengguna dilaksanakan dan digunakan untuk pengecualian yang dicentang dan tidak dicentang.
2. Keperluan Pengecualian Tersuai
Pengecualian Java merangkumi hampir semua pengecualian umum yang pasti berlaku dalam pengaturcaraan.
Walau bagaimanapun, kadang-kadang kita perlu menambah pengecualian standard ini dengan pengecualian kita sendiri.
Sebab utama memperkenalkan pengecualian khusus adalah:
- Pengecualian logik perniagaan - Pengecualian yang khusus untuk logik perniagaan dan aliran kerja. Ini membantu pengguna aplikasi atau pembangun memahami apa masalah sebenarnya
- Untuk menangkap dan memberikan rawatan khusus kepada subkumpulan pengecualian Java yang ada
Pengecualian Java dapat dicentang dan tidak dicentang. Pada bahagian seterusnya, kita akan membahas kedua-dua kes ini.
3. Pengecualian yang diperiksa khas
Pengecualian yang diperiksa adalah pengecualian yang perlu diperlakukan secara eksplisit.
Mari pertimbangkan sekeping kod yang mengembalikan baris pertama fail:
try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) return file.nextLine(); } catch(FileNotFoundException e) { // Logging, etc }
Kod di atas adalah cara klasik untuk menangani pengecualian yang diperiksa oleh Java. Walaupun kod melemparkan FileNotFoundException, tidak jelas apakah penyebab sebenarnya - sama ada fail itu tidak wujud atau nama fail tidak sah.
Untuk membuat pengecualian tersuai, kita harus memperluas kelas java.lang.Exception .
Mari kita lihat contohnya dengan membuat pengecualian diperiksa khas yang disebut IncorrectFileNameException:
public class IncorrectFileNameException extends Exception { public IncorrectFileNameException(String errorMessage) { super(errorMessage); } }
Perhatikan bahawa kita juga harus menyediakan konstruktor yang mengambil String sebagai mesej ralat dan memanggil pembina kelas induk.
Ini semua yang perlu kita lakukan untuk menentukan pengecualian khusus.
Seterusnya, mari kita lihat bagaimana kita dapat menggunakan pengecualian khusus dalam contoh kita:
try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) return file.nextLine(); } catch (FileNotFoundException e) { if (!isCorrectFileName(fileName)) { throw new IncorrectFileNameException("Incorrect filename : " + fileName ); } //... }
Kami telah membuat dan menggunakan pengecualian khusus, sehingga pengguna sekarang dapat mengetahui apa pengecualian sebenarnya. Adakah ini mencukupi? Kami akibatnya kehilangan punca pengecualian .
Untuk memperbaikinya, kita juga boleh menambahkan parameter java.lang.Throwable pada pembina. Dengan cara ini, kita dapat meneruskan pengecualian root ke panggilan kaedah:
public IncorrectFileNameException(String errorMessage, Throwable err) { super(errorMessage, err); }
Sekarang, IncorrectFileNameException digunakan bersama dengan punca pengecualian seperti ini:
try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) { return file.nextLine(); } } catch (FileNotFoundException err) { if (!isCorrectFileName(fileName)) { throw new IncorrectFileNameException( "Incorrect filename : " + fileName , err); } // ... }
Ini adalah bagaimana kita dapat menggunakan pengecualian khusus tanpa kehilangan akar penyebabnya .
4. Pengecualian Tidak Dikemas kini
Dalam contoh yang sama, mari kita anggap bahawa kita memerlukan pengecualian khusus jika nama fail tidak mengandungi ekstensi.
Dalam kes ini, kami memerlukan pengecualian yang tidak diperiksa khas yang serupa dengan yang sebelumnya, kerana ralat ini hanya akan dapat dikesan semasa menjalankan.
Untuk membuat pengecualian yang tidak dicentang, kita perlu memperluaskan kelas java.lang.RuntimeException :
public class IncorrectFileExtensionException extends RuntimeException { public IncorrectFileExtensionException(String errorMessage, Throwable err) { super(errorMessage, err); } }
Oleh itu, kita boleh menggunakan pengecualian tidak diperiksa khas ini dalam contoh kita:
try (Scanner file = new Scanner(new File(fileName))) { if (file.hasNextLine()) { return file.nextLine(); } else { throw new IllegalArgumentException("Non readable file"); } } catch (FileNotFoundException err) { if (!isCorrectFileName(fileName)) { throw new IncorrectFileNameException( "Incorrect filename : " + fileName , err); } //... } catch(IllegalArgumentException err) { if(!containsExtension(fileName)) { throw new IncorrectFileExtensionException( "Filename does not contain extension : " + fileName, err); } //... }
5. Kesimpulan
Pengecualian khusus sangat berguna apabila kita perlu menangani pengecualian khusus yang berkaitan dengan logik perniagaan. Apabila digunakan dengan betul, mereka dapat berfungsi sebagai alat yang berguna untuk pengendalian dan pembalakan pengecualian yang lebih baik.
Kod untuk contoh yang digunakan dalam artikel ini terdapat di Github.