Episode ini membahas exception handling di Groovy: try/catch/finally, multi-catch, dan resource management. Kalian juga akan membuat custom exception, menangani error runtime, serta mempraktikkan teknik debugging script Groovy dan memeriksa nilai runtime.

Program yang berjalan mulus tanpa error adalah pengecualian, bukan aturan. Episode 7 membekali kalian kemampuan menangani error dengan anggun dan menemukan akar masalah saat program gagal.
Kalian akan belajar try/catch/finally, multi-catch, resource management, custom exception, serta teknik debugging script Groovy dan memeriksa nilai runtime.
Struktur try/catch/finally di Groovy identik dengan Java. Blok finally selalu dieksekusi, baik terjadi exception maupun tidak:
try {
def hasil = 10 / 0
println hasil
} catch (ArithmeticException e) {
println "Terjadi pembagian dengan nol: ${e.message}"
} finally {
println "Blok finally selalu dijalankan"
}try { def hasil = 10 / 0 } melempar ArithmeticException saat runtime, ditangkap oleh blok catch, lalu finally tetap berjalan. Blok finally biasanya dipakai untuk membersihkan resource seperti koneksi database.
Groovy mendukung multi-catch dalam satu blok, memakai pipe di antara tipe exception:
def bacaAngka(String teks) {
try {
return Integer.parseInt(teks)
} catch (NumberFormatException | NullPointerException e) {
println "Input tidak valid: ${e.message}"
return null
}
}
println bacaAngka("abc")catch (NumberFormatException | NullPointerException e) menangkap dua jenis exception sekaligus dalam satu blok — sintaks yang baru tersedia di Java 7 dan sepenuhnya didukung Groovy.
try {
throw new RuntimeException("Gagal memproses")
} catch (e) {
println "Error: ${e.message}"
}Pola ini berguna di lapisan terluar aplikasi, misalnya untuk mencatat log sebelum program berhenti.
Groovy menyediakan pola yang lebih aman daripada menutup resource manual. withCloseable memastikan resource ditutup otomatis setelah blok selesai:
import java.nio.file.Files
import java.nio.file.Paths
def path = Paths.get("/tmp/contoh.txt")
Files.newOutputStream(path).withCloseable { stream ->
stream.write("Halo".bytes)
}
println "File berhasil ditulis"Files.newOutputStream(path).withCloseable { stream -> ... } membuka stream, mengeksekusi closure, lalu menutup stream secara otomatis. Pola ini setara dengan try-with-resources di Java tanpa boilerplate.
withCloseable atau withReader untuk semua I/O.class SaldoTidakCukupException extends RuntimeException {
SaldoTidakCukupException(String pesan) {
super(pesan)
}
}
def tarikSaldo(int saldo, int jumlah) {
if (jumlah > saldo) {
throw new SaldoTidakCukupException("Saldo tidak cukup: ${saldo}")
}
return saldo - jumlah
}
try {
tarikSaldo(100, 150)
} catch (SaldoTidakCukupException e) {
println "Gagal: ${e.message}"
}class SaldoTidakCukupException extends RuntimeException membuat exception custom, dan throw new SaldoTidakCukupException("...") melemparnya untuk ditangkap secara spesifik.
Custom exception berguna ketika satu jenis error harus ditangani berbeda di banyak tempat, atau saat error perlu membawa data tambahan seperti id transaksi. Hindari membuat custom exception berlebihan; gunakan exception bawaan Java jika sudah cukup.
Cara paling sederhana memeriksa nilai runtime adalah println. Untuk detail lebih dalam, inspect menampilkan representasi literal objek:
def data = [nama: "Arman", nilai: [80, 90]]
println data.inspect()
println "Tipe data: ${data.getClass().getSimpleName()}"data.inspect() menghasilkan representasi literal yang bisa dievaluasi kembali — sangat berguna saat men-debug struktur data. Sementara getClass().getSimpleName() menunjukkan tipe dinamis sebenarnya.
Jika memakai IntelliJ IDEA, tambahkan breakpoint langsung pada script .groovy dan jalankan dalam mode debug:
try {
new File("/tidak/ada/file.txt").text
} catch (Exception e) {
e.printStackTrace()
}e.printStackTrace() mencetak rangkaian pemanggilan method hingga titik error. Baca stack trace dari baris paling atas, karena itulah lokasi paling dekat dengan penyebab sebenarnya.
Untuk error pertama, periksa ejaan method dan pastikan closure memakai nama parameter yang benar. Untuk error terakhir, terapkan operator ?. dan ?: yang sudah kita pelajari di episode 4.
Episode 7 melengkapi kemampuan penanganan error kalian: try/catch/finally, multi-catch, resource management dengan withCloseable, custom exception, serta teknik debugging script dengan println, inspect, dan stack trace.
Inti yang harus dibawa pulang:
finally selalu berjalan, entah terjadi exception atau tidak.withCloseable menutup resource otomatis tanpa boilerplate.inspect() menampilkan representasi literal objek saat debugging.Di episode 8 selanjutnya kita akan membahas scripting dan command-line automation — menulis script Groovy untuk tugas otomasi, parsing argumen command-line dan environment variables, serta file handling, text processing, dan log output.