Error Handling dalam Ruby: Menangani Exception dengan Elegan

| Ruby | ruby, tutorial, error-handling, exception, rescue

Error Handling dalam Ruby: Menangani Exception dengan Elegan

Error pasti terjadi — file tidak ditemukan, koneksi gagal, input salah. Yang membedakan kode profesional dari amatir adalah cara menangani error-nya.

1. Apa Itu Exception?

Exception adalah error yang terjadi saat eksekusi kode. Kalau tidak ditangani, program akan crash.

# Contoh exception
puts 10 / 0
# => ZeroDivisionError: divided by 0

puts "hello".to_i
# => 0 (tidak error, tapi hasil tidak sesuai harapan)

2. Begin/Rescue — Menangani Error

begin
  # kode yang mungkin error
  hasil = 10 / 0
rescue ZeroDivisionError
  # kode yang dijalankan kalau error
  puts "Tidak bisa dibagi nol!"
end
# Output: Tidak bisa dibagi nol!

Rescue dengan Error Message

begin
  file = File.open("tidak_ada.txt")
rescue Errno::ENOENT => e
  puts "Error: #{e.message}"
end
# Output: Error: No such file or directory - tidak_ada.txt

Multiple Rescue

begin
  # kode berisiko
rescue ZeroDivisionError
  puts "Pembagian nol"
rescue Errno::ENOENT
  puts "File tidak ditemukan"
rescue => e
  puts "Error lain: #{e.message}"
end

3. Ensure — Selalu Dijalankan

ensure menjalankan kode apapun yang terjadi — error atau tidak.

begin
  file = File.open("data.txt")
  # proses file
rescue Errno::ENOENT
  puts "File tidak ditemukan"
ensure
  file.close if file
  puts "Proses selesai"
end

ensure cocok buat cleanup — tutup file, tutup koneksi, dll.

4. Raise — Melempar Error Sendiri

def bagi(a, b)
  raise ZeroDivisionError, "Tidak bisa bagi nol" if b == 0
  a / b
end

begin
  bagi(10, 0)
rescue ZeroDivisionError => e
  puts e.message
end
# Output: Tidak bisa bagi nol

5. Custom Exception

Buat exception sendiri untuk error spesifik:

class ValidationError < StandardError
  def initialize(pesan)
    super(pesan)
  end
end

def simpan_user(nama)
  raise ValidationError, "Nama wajib diisi" if nama.nil? || nama.empty?
  puts "User tersimpan: #{nama}"
end

begin
  simpan_user("")
rescue ValidationError => e
  puts "Error: #{e.message}"
end
# Output: Error: Nama wajib diisi

6. Retry — Coba Ulang

begin
  response = Net::HTTP.get(URI("https://api.example.com"))
rescue Net::OpenTimeout, Net::ReadTimeout
  puts "Koneksi gagal, mencoba ulang..."
  retry
end

Peringatan: Jangan pakai retry tanpa batas — bisa infinite loop.

7. Error Handling yang Baik

# ✅ Spesifik — tangkap error yang tepat
begin
  JSON.parse(invalid_json)
rescue JSON::ParserError => e
  puts "JSON tidak valid: #{e.message}"
end

# ❌ Terlalu umum — sembunyikan semua error
begin
  JSON.parse(invalid_json)
rescue => e
  puts "Error"  # tidak jelas error-nya apa
end

Tips

# ✅ Gunakan message yang informatif
raise ArgumentError, "Password minimal 8 karakter"

# ✅ Log error untuk debugging
rescue => e
  Rails.logger.error(e.message)
  puts "Terjadi kesalahan"
end

# ✅ Jangan tangkap error yang tidak bisa ditangani
rescue SystemExit
  raise  # lempar ulang

8. Ringkasan

Konsep Fungsi Contoh
begin/rescue Tangkap error rescue ZeroDivisionError
ensure Selalu dijalankan ensure file.close
raise Lempar error raise "Error!"
retry Coba ulang retry
Custom exception Error spesifik class MyError < StandardError

Penutup

Error handling bukan optional — ini bagian dari kode yang production-ready. Gunakan rescue untuk tangkap error, ensure untuk cleanup, dan raise untuk melempar error yang jelas.

Di artikel selanjutnya, kita akan bahas Gems: Manajemen Paket Ruby — cara install, pakai, dan manage gems.


Mail Facebook Twitter Whatsapp