Groovy - Penanganan Pengecualian
Penanganan pengecualian diperlukan dalam bahasa pemrograman apa pun untuk menangani error runtime sehingga aliran normal aplikasi dapat dipertahankan.
Exception biasanya mengganggu aliran normal aplikasi, itulah alasan mengapa kita perlu menggunakan penanganan Exception dalam aplikasi kita.
Pengecualian secara luas diklasifikasikan ke dalam kategori berikut -
Checked Exception - Kelas yang memperluas kelas Throwable kecuali RuntimeException dan Error dikenal sebagai pengecualian yang diperiksa egIOException, SQLException, dll. Pengecualian yang diperiksa diperiksa pada waktu kompilasi.
Salah satu kasus klasik adalah FileNotFoundException. Misalkan Anda memiliki kode berikut di aplikasi Anda yang membaca dari file di drive E.
class Example {
static void main(String[] args) {
File file = new File("E://file.txt");
FileReader fr = new FileReader(file);
}
}
jika File (file.txt) tidak ada di drive E maka pengecualian berikut akan dimunculkan.
Tertangkap: java.io.FileNotFoundException: E: \ file.txt (Sistem tidak dapat menemukan file yang ditentukan).
java.io.FileNotFoundException: E: \ file.txt (Sistem tidak dapat menemukan file yang ditentukan).
Unchecked Exception - Kelas yang memperluas RuntimeException dikenal sebagai pengecualian yang tidak dicentang, misalnya, ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException, dll. Pengecualian yang tidak dicentang tidak diperiksa pada waktu kompilasi melainkan diperiksa pada waktu proses.
Salah satu kasus klasik adalah ArrayIndexOutOfBoundsException yang terjadi saat Anda mencoba mengakses indeks larik yang lebih besar dari panjang larik. Berikut adalah contoh tipikal dari jenis kesalahan ini.
class Example {
static void main(String[] args) {
def arr = new int[3];
arr[5] = 5;
}
}
Ketika kode di atas dijalankan, pengecualian berikut akan dimunculkan.
Tertangkap: java.lang.ArrayIndexOutOfBoundsException: 5
java.lang.ArrayIndexOutOfBoundsException: 5
Error - Kesalahan tidak dapat dipulihkan misalnya OutOfMemoryError, VirtualMachineError, AssertionError dll.
Ini adalah kesalahan yang tidak dapat dipulihkan oleh program dan akan menyebabkan program macet.
Diagram berikut menunjukkan bagaimana hierarki pengecualian di Groovy diatur. Semuanya didasarkan pada hierarki yang ditentukan di Java.
Pengecualian Penangkapan
Sebuah metode menangkap pengecualian menggunakan kombinasi dari try dan catchkata kunci. Sebuah blok coba / tangkap ditempatkan di sekitar kode yang mungkin menghasilkan pengecualian.
try {
//Protected code
} catch(ExceptionName e1) {
//Catch block
}
Semua kode Anda yang dapat menimbulkan pengecualian ditempatkan di blok kode yang dilindungi.
Di blok catch, Anda dapat menulis kode khusus untuk menangani pengecualian Anda sehingga aplikasi dapat memulihkan dari pengecualian tersebut.
Mari kita lihat contoh kode serupa yang kita lihat di atas untuk mengakses array dengan nilai indeks yang lebih besar dari ukuran array. Tapi kali ini mari kita bungkus kode kita dalam blok coba / tangkap.
class Example {
static void main(String[] args) {
try {
def arr = new int[3];
arr[5] = 5;
} catch(Exception ex) {
println("Catching the exception");
}
println("Let's move on after the exception");
}
}
Saat kita menjalankan program di atas, kita akan mendapatkan hasil sebagai berikut -
Catching the exception
Let's move on after the exception
Dari kode di atas, kami membungkus kode yang salah di blok percobaan. Di blok catch kita hanya menangkap eksepsi kita dan mengeluarkan pesan bahwa eksepsi telah terjadi.
Beberapa Catch Block
Seseorang dapat memiliki beberapa blok tangkapan untuk menangani berbagai jenis pengecualian. Untuk setiap blok catch, tergantung pada tipe exception yang muncul, Anda akan menulis kode untuk menanganinya.
Mari ubah kode di atas untuk menangkap ArrayIndexOutOfBoundsException secara khusus. Berikut adalah potongan kodenya.
class Example {
static void main(String[] args) {
try {
def arr = new int[3];
arr[5] = 5;
}catch(ArrayIndexOutOfBoundsException ex) {
println("Catching the Array out of Bounds exception");
}catch(Exception ex) {
println("Catching the exception");
}
println("Let's move on after the exception");
}
}
Saat kita menjalankan program di atas, kita akan mendapatkan hasil sebagai berikut -
Catching the Aray out of Bounds exception
Let's move on after the exception
Dari kode di atas Anda dapat melihat bahwa blok catch ArrayIndexOutOfBoundsException ditangkap terlebih dahulu karena itu berarti kriteria pengecualian.
Akhirnya Blokir
Itu finallyblok mengikuti blok percobaan atau blok tangkap. Blok kode terakhir selalu dijalankan, terlepas dari terjadinya Exception.
Menggunakan last block memungkinkan Anda menjalankan pernyataan tipe pembersihan apa pun yang ingin Anda jalankan, apa pun yang terjadi dalam kode yang dilindungi. Sintaks untuk blok ini diberikan di bawah ini.
try {
//Protected code
} catch(ExceptionType1 e1) {
//Catch block
} catch(ExceptionType2 e2) {
//Catch block
} catch(ExceptionType3 e3) {
//Catch block
} finally {
//The finally block always executes.
}
Mari kita ubah kode di atas dan tambahkan blok kode terakhir. Berikut adalah potongan kodenya.
class Example {
static void main(String[] args) {
try {
def arr = new int[3];
arr[5] = 5;
} catch(ArrayIndexOutOfBoundsException ex) {
println("Catching the Array out of Bounds exception");
}catch(Exception ex) {
println("Catching the exception");
} finally {
println("The final block");
}
println("Let's move on after the exception");
}
}
Saat kita menjalankan program di atas, kita akan mendapatkan hasil sebagai berikut -
Catching the Array out of Bounds exception
The final block
Let's move on after the exception
Berikut adalah metode Pengecualian yang tersedia di Groovy -
public String getMessage ()
Mengembalikan pesan rinci tentang pengecualian yang telah terjadi. Pesan ini diinisialisasi di konstruktor Throwable.
public Throwable getCause ()
Mengembalikan penyebab pengecualian seperti yang diwakili oleh objek yang dapat dilempar.
public String toString ()
Mengembalikan nama kelas yang digabungkan dengan hasil getMessage ()
public void printStackTrace ()
Mencetak hasil toString () bersama dengan pelacakan tumpukan ke System.err, aliran keluaran kesalahan.
public StackTraceElement [] getStackTrace ()
Mengembalikan larik yang berisi setiap elemen di jejak tumpukan. Elemen di indeks 0 mewakili bagian atas tumpukan panggilan, dan elemen terakhir dalam larik mewakili metode di bagian bawah tumpukan panggilan.
public Throwable fillInStackTrace ()
Mengisi pelacakan tumpukan dari objek Throwable ini dengan pelacakan tumpukan saat ini, menambahkan informasi sebelumnya dalam pelacakan tumpukan.
Contoh
Berikut adalah contoh kode menggunakan beberapa metode yang diberikan di atas -
class Example {
static void main(String[] args) {
try {
def arr = new int[3];
arr[5] = 5;
}catch(ArrayIndexOutOfBoundsException ex) {
println(ex.toString());
println(ex.getMessage());
println(ex.getStackTrace());
} catch(Exception ex) {
println("Catching the exception");
}finally {
println("The final block");
}
println("Let's move on after the exception");
}
}
Saat kita menjalankan program di atas, kita akan mendapatkan hasil sebagai berikut -
java.lang.ArrayIndexOutOfBoundsException: 5
5
[org.codehaus.groovy.runtime.dgmimpl.arrays.IntegerArrayPutAtMetaMethod$MyPojoMetaMet
hodSite.call(IntegerArrayPutAtMetaMethod.java:75),
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) ,
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) ,
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133) ,
Example.main(Sample:8), sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57),
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ,
java.lang.reflect.Method.invoke(Method.java:606),
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93),
groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325),
groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1443),
org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:893),
groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:287),
groovy.lang.GroovyShell.run(GroovyShell.java:524),
groovy.lang.GroovyShell.run(GroovyShell.java:513),
groovy.ui.GroovyMain.processOnce(GroovyMain.java:652),
groovy.ui.GroovyMain.run(GroovyMain.java:384),
groovy.ui.GroovyMain.process(GroovyMain.java:370),
groovy.ui.GroovyMain.processArgs(GroovyMain.java:129),
groovy.ui.GroovyMain.main(GroovyMain.java:109),
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57),
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ,
java.lang.reflect.Method.invoke(Method.java:606),
org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:109),
org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:131),
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57),
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ,
java.lang.reflect.Method.invoke(Method.java:606),
com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)]
The final block
Let's move on after the exception