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.