Pengecualian Berantai di Jawa

1. Ikhtisar

Pada artikel ini, kita akan melihat secara singkat apa itu Exception dan membahas secara mendalam tentang pembahasan pengecualian berantai di Java.

Sederhananya, pengecualian adalah peristiwa yang mengganggu aliran normal eksekusi program. Sekarang mari kita lihat dengan tepat bagaimana kita dapat merangkai pengecualian untuk mendapatkan semantik yang lebih baik darinya.

2. Pengecualian Berantai

Chained Exception membantu mengidentifikasi situasi di mana satu pengecualian menyebabkan Pengecualian lain dalam aplikasi.

Misalnya, pertimbangkan metode yang melempar ArithmeticException karena upaya untuk membagi dengan nol tetapi penyebab pengecualian sebenarnya adalah kesalahan I / O yang menyebabkan pembagi menjadi nol. Metode tersebut akan melempar ArithmeticException ke pemanggil. Penelepon tidak akan tahu tentang penyebab sebenarnya dari Pengecualian . Pengecualian Berantai digunakan dalam situasi seperti itu.

Konsep ini diperkenalkan di JDK 1.4.

Mari kita lihat bagaimana pengecualian berantai didukung di Java.

3. Kelas Lempar

Kelas Throwable memiliki beberapa konstruktor dan metode untuk mendukung pengecualian berantai. Pertama, mari kita lihat konstruktornya.

  • Throwable (Throwable cause) - Throwable memiliki satu parameter, yang menentukan penyebab sebenarnya dari suatu Pengecualian .
  • Throwable (String desc, Throwable cause) - konstruktor ini menerimadeskripsi Exception dengan penyebab sebenarnya dari Exception juga.

Selanjutnya, mari kita lihat metode yang disediakan kelas ini:

  • Metode getCause () - Metode ini mengembalikan penyebab sebenarnya yang terkait dengan Pengecualian saat ini.
  • metode initCause () - Ini menetapkan penyebab yang mendasari dengan menjalankan Exception .

4. Contoh

Sekarang, mari kita lihat contoh di mana kita akan menetapkan deskripsi Exception kita sendiri dan melempar Exception yang berantai :

public class MyChainedException { public void main(String[] args) { try { throw new ArithmeticException("Top Level Exception.") .initCause(new IOException("IO cause.")); } catch(ArithmeticException ae) { System.out.println("Caught : " + ae); System.out.println("Actual cause: "+ ae.getCause()); } } }

Seperti yang ditebak, ini akan mengarah pada:

Caught: java.lang.ArithmeticException: Top Level Exception. Actual cause: java.io.IOException: IO cause.

5. Mengapa Pengecualian Berantai?

Kita perlu merangkai pengecualian agar log dapat dibaca. Mari kita tulis dua contoh. Pertama tanpa merangkai pengecualian dan kedua, dengan pengecualian berantai. Nanti, kita akan membandingkan bagaimana log berperilaku di kedua kasus tersebut.

Untuk memulai, kami akan membuat serangkaian Pengecualian:

class NoLeaveGrantedException extends Exception { public NoLeaveGrantedException(String message, Throwable cause) { super(message, cause); } public NoLeaveGrantedException(String message) { super(message); } } class TeamLeadUpsetException extends Exception { // Both Constructors }

Sekarang, mari mulai menggunakan pengecualian di atas dalam contoh kode.

5.1. Tanpa Rantai

Mari kita tulis program contoh tanpa merangkai pengecualian khusus kita.

public class MainClass { public void main(String[] args) throws Exception { getLeave(); } void getLeave() throws NoLeaveGrantedException { try { howIsTeamLead(); } catch (TeamLeadUpsetException e) { e.printStackTrace(); throw new NoLeaveGrantedException("Leave not sanctioned."); } } void howIsTeamLead() throws TeamLeadUpsetException { throw new TeamLeadUpsetException("Team Lead Upset"); } }

Pada contoh di atas, log akan terlihat seperti ini:

com.baeldung.chainedexception.exceptions.TeamLeadUpsetException: Team lead Upset at com.baeldung.chainedexception.exceptions.MainClass .howIsTeamLead(MainClass.java:46) at com.baeldung.chainedexception.exceptions.MainClass .getLeave(MainClass.java:34) at com.baeldung.chainedexception.exceptions.MainClass .main(MainClass.java:29) Exception in thread "main" com.baeldung.chainedexception.exceptions. NoLeaveGrantedException: Leave not sanctioned. at com.baeldung.chainedexception.exceptions.MainClass .getLeave(MainClass.java:37) at com.baeldung.chainedexception.exceptions.MainClass .main(MainClass.java:29)

5.2. Dengan Chaining

Selanjutnya, mari kita tulis contoh dengan merangkai pengecualian khusus kita:

public class MainClass { public void main(String[] args) throws Exception { getLeave(); } public getLeave() throws NoLeaveGrantedException { try { howIsTeamLead(); } catch (TeamLeadUpsetException e) { throw new NoLeaveGrantedException("Leave not sanctioned.", e); } } public void howIsTeamLead() throws TeamLeadUpsetException { throw new TeamLeadUpsetException("Team lead Upset."); } }

Terakhir, mari kita lihat log yang diperoleh dengan pengecualian berantai:

Exception in thread "main" com.baeldung.chainedexception.exceptions .NoLeaveGrantedException: Leave not sanctioned. at com.baeldung.chainedexception.exceptions.MainClass .getLeave(MainClass.java:36) at com.baeldung.chainedexception.exceptions.MainClass .main(MainClass.java:29) Caused by: com.baeldung.chainedexception.exceptions .TeamLeadUpsetException: Team lead Upset. at com.baeldung.chainedexception.exceptions.MainClass .howIsTeamLead(MainClass.java:44) at com.baeldung.chainedexception.exceptions.MainClass .getLeave(MainClass.java:34) ... 1 more

Kita dapat dengan mudah membandingkan log yang ditampilkan dan menyimpulkan bahwa pengecualian berantai mengarah ke log yang lebih bersih.

Pada artikel ini, kita telah melihat konsep pengecualian berantai.

Implementasi semua contoh dapat ditemukan di proyek Github - ini adalah proyek berbasis Maven, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.