Pengecualian Wrapping vs Rethrowing di Java

1. Ikhtisar

Kata kunci throw di Java digunakan untuk secara eksplisit menampilkan pengecualian yang dibuat khusus atau pengecualian bawaan. Tapi terkadang di blok catch , kita perlu membuang pengecualian yang sama lagi. Ini mengarah pada pelepasan kembali pengecualian.

Dalam tutorial ini, kita akan membahas dua cara paling umum untuk mengembalikan pengecualian.

2. Melempar Ulang Pengecualian

Terkadang sebelum menyebarkan pengecualian ke tingkat yang lebih tinggi, kami mungkin ingin melakukan beberapa aktivitas. Misalnya, kami mungkin ingin membatalkan transaksi DB, mencatat pengecualian, atau mengirim email.

Kita dapat melakukan aktivitas seperti itu di blok penangkap dan membuang kembali pengecualian. Dengan cara ini, level yang lebih tinggi akan diberi tahu bahwa pengecualian telah terjadi dalam sistem.

Mari kita pahami kasus kita dengan sebuah contoh.

Di bawah ini, kami menampilkan kembali pengecualian yang sama. Dan, kami mencatat pesan kesalahan sebelum melemparkannya:

String name = null; try { return name.equals("Joe"); // causes NullPointerException } catch (Exception e) { // log throw e; }

Konsol akan menampilkan pesan berikut:

Exception in thread "main" java.lang.NullPointerException at com.baeldung.exceptions.RethrowSameExceptionDemo.main(RethrowSameExceptionDemo.java:16)

Seperti yang bisa kita lihat, kode kita hanya menampilkan kembali pengecualian apa pun yang ditangkapnya. Karena itu, kami mendapatkan pelacakan tumpukan asli tanpa perubahan apa pun .

3. Pengecualian Pembungkus

Sekarang, mari kita lihat pendekatan yang berbeda.

Dalam kasus ini, kami akan meneruskan pengecualian yang sama sebagai referensi dalam konstruktor pengecualian berbeda:

String name = null; try { return name.equals("Joe"); // causes NullPointerException } catch (Exception e) { // log throw new IllegalArgumentException(e); }

Konsol akan menampilkan:

Exception in thread "main" java.lang.IllegalArgumentException: java.lang.NullPointerException at com.baeldung.exceptions.RethrowDifferentExceptionDemo.main(RethrowDifferentExceptionDemo.java:24) Caused by: java.lang.NullPointerException at com.baeldung.exceptions.RethrowDifferentExceptionDemo.main(RethrowDifferentExceptionDemo.java:18) 

Kali ini, kami melihat pengecualian asli serta pembungkusnya. Dengan cara ini, instance IllegalArgumentException kami membungkus NullPointerException asli sebagai penyebabnya . Karenanya kita dapat menampilkan pengecualian yang lebih spesifik daripada menampilkan yang umum.

4. Kesimpulan

Dalam artikel singkat ini, kami menyajikan perbedaan utama antara membuang kembali pengecualian asli vs membungkusnya terlebih dahulu. Kedua cara berbeda satu sama lain dalam cara mereka menampilkan pesan pengecualian .

Berdasarkan persyaratan kami, kami dapat membuang kembali pengecualian yang sama atau membungkusnya dengan beberapa pengecualian khusus dengan menggunakan pendekatan kedua. The Pendekatan kedua terlihat lebih bersih dan mudah untuk mundur pengecualian .

Seperti biasa, proyek ini tersedia di GitHub.