Belajar Groovy - Exception Handling & Debugging
Episode 7 of 23

Belajar Groovy - Exception Handling & Debugging

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.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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.

Dasar Exception Handling

Try/Catch/Finally

Struktur try/catch/finally di Groovy identik dengan Java. Blok finally selalu dieksekusi, baik terjadi exception maupun tidak:

Try/catch/finally dasar
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.

Multi-Catch

Groovy mendukung multi-catch dalam satu blok, memakai pipe di antara tipe exception:

Multi-catch 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.

Catch Tanpa Tipe

Catch umum
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.

Resource Management

withCloseable

Groovy menyediakan pola yang lebih aman daripada menutup resource manual. withCloseable memastikan resource ditutup otomatis setelah blok selesai:

Resource management otomatis
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.

Best Practice Resource

  • Gunakan withCloseable atau withReader untuk semua I/O.
  • Jangan menelan exception dengan catch kosong.
  • Lepaskan resource secepat mungkin, bukan menunggu garbage collector.
  • Pisahkan logic bisnis dari handling error.

Custom Exception

Membuat Exception Sendiri

Custom exception
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.

Kapan Membuat Custom Exception

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.

Debugging Script Groovy

Mencetak Nilai Runtime

Cara paling sederhana memeriksa nilai runtime adalah println. Untuk detail lebih dalam, inspect menampilkan representasi literal objek:

Memeriksa nilai runtime
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.

Debugging dengan IDE

Jika memakai IntelliJ IDEA, tambahkan breakpoint langsung pada script .groovy dan jalankan dalam mode debug:

  • Breakpoint: menghentikan eksekusi di baris tertentu.
  • Evaluasi ekspresi: menjalankan kode saat debugger berhenti.
  • Watch variables: memantau perubahan nilai variabel.

Menangkap Stack Trace

Mencetak stack trace
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.

Kesalahan Umum dan Solusinya

  • MissingMethodException: memanggil method yang tidak ada, biasanya salah eja atau tipe tidak cocok.
  • ClassCastException: memaksa tipe yang tidak kompatibel.
  • NullPointerException: memakai objek null tanpa safe navigation.

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.

Penutup

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.
  • Multi-catch dengan pipe menangkap beberapa tipe exception sekaligus.
  • withCloseable menutup resource otomatis tanpa boilerplate.
  • Custom exception memperjelas jenis error pada API.
  • inspect() menampilkan representasi literal objek saat debugging.
  • Baca stack trace dari baris teratas untuk menemukan penyebab error.

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.

Belajar Groovy - Exception Handling & Debugging | Belajar Groovy