Pengecualian Berantai di Jawa

1. Gambaran keseluruhan

Dalam artikel ini, kita akan melihat secara ringkas apa itu Pengecualian dan membahas secara mendalam mengenai membincangkan pengecualian berantai di Jawa.

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

2. Pengecualian Berantai

Pengecualian Berantai membantu mengenal pasti keadaan di mana satu pengecualian menyebabkan Pengecualian lain dalam aplikasi.

Sebagai contoh, pertimbangkan kaedah yang melemparkan ArithmeticException kerana percubaan untuk membahagi dengan sifar tetapi penyebab pengecualian sebenarnya adalah ralat I / O yang menyebabkan pembahagi menjadi sifar. Kaedah ini akan membuang ArithmeticException kepada pemanggil. Pemanggil tidak akan mengetahui mengenai punca sebenar Pengecualian . Pengecualian Berantai digunakan dalam situasi seperti itu.

Konsep ini diperkenalkan di JDK 1.4.

Mari lihat bagaimana pengecualian berantai disokong di Java.

3. Kelas Boleh Lempar

Kelas dilempar mempunyai beberapa pembina dan kaedah untuk menyokong pengecualian berantai. Pertama, mari kita lihat pembina.

  • Throwable (Throwable sebab) - Throwable mempunyai satu parameter, yang menentukan sebab sebenar Pengecualian .
  • Throwable (String desc, Throwable sebab) - konstruktor ini menerimapenerangan Pengecualian dengan sebab sebenar Pengecualian juga.

Seterusnya, mari kita lihat kaedah yang disediakan oleh kelas ini:

  • kaedah getCause () - Kaedah ini mengembalikan sebab sebenar yang berkaitan dengan Pengecualian semasa.
  • kaedah initCause () - Ini menetapkan sebab yang mendasari dengan meminta Pengecualian .

4. Contoh

Sekarang, mari kita lihat contoh di mana kita akan menetapkan penerangan Pengecualian kita sendiri dan membuang Pengecualian yang dirantai :

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 membawa kepada:

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

5. Mengapa Pengecualian Berantai?

Kita perlu mengecualikan pengecualian agar log dibaca. Mari tulis dua contoh. Pertama tanpa mengecualikan pengecualian dan kedua, dengan pengecualian berantai. Kemudian, kami akan membandingkan bagaimana log berkelakuan dalam kedua-dua kes tersebut.

Untuk memulakan, kami akan membuat siri 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 kita mula menggunakan pengecualian di atas dalam contoh kod.

5.1. Tanpa Rantai

Mari tulis program contoh tanpa mengecualikan pengecualian khusus kami.

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

Dalam contoh di atas, log akan kelihatan 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 Rantai

Seterusnya, mari kita tulis contoh dengan mengikat 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."); } }

Akhirnya, 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 membandingkan log yang ditunjukkan dengan mudah dan membuat kesimpulan bahawa pengecualian yang dirantai menyebabkan log yang lebih bersih.

Dalam artikel ini, kami melihat konsep pengecualian berantai.

Pelaksanaan semua contoh boleh didapati dalam projek Github - ini adalah projek berasaskan Maven, jadi mudah diimport dan dijalankan sebagaimana adanya.