Dalam pengembangan perangkat lunak, program yang baik tidak hanya harus berfungsi dengan benar pada kondisi ideal, tetapi juga harus mampu menangani situasi tak terduga yang dapat menyebabkan kegagalan eksekusi. Situasi tak terduga inilah yang dalam pemrograman dikenal sebagai 'eksepsi' (exceptions). Di Python, mekanisme untuk mengelola eksepsi ini dikenal sebagai exception handling.
Exception handling pada Python memungkinkan pengembang untuk mendeteksi kesalahan saat program sedang berjalan (runtime errors) dan memberikan respons yang terkontrol daripada membiarkan program berhenti secara tiba-tiba (crash). Ini sangat penting untuk menjaga stabilitas aplikasi, terutama saat berinteraksi dengan input pengguna yang tidak terduga, operasi file, atau koneksi jaringan.
Python menyediakan empat blok utama untuk mengelola eksepsi: try, except, else, dan finally.
try: Blok kode yang berpotensi menimbulkan eksepsi ditempatkan di sini.except: Blok ini akan dieksekusi jika terjadi eksepsi di dalam blok try. Anda bisa menentukan jenis eksepsi spesifik yang ingin ditangkap (misalnya, ValueError, ZeroDivisionError).else: Blok ini bersifat opsional dan akan dieksekusi hanya jika blok try berhasil dieksekusi tanpa menimbulkan eksepsi sama sekali.finally: Blok ini juga opsional, namun sangat penting. Kode di dalamnya akan selalu dieksekusi, terlepas dari apakah eksepsi terjadi atau tidak. Ini ideal untuk operasi pembersihan (misalnya, menutup koneksi database atau file).
Mari kita lihat sebuah contoh program exception handling pada Python yang menangani pembagian bilangan, di mana pembagi nol (ZeroDivisionError) adalah kesalahan yang umum terjadi.
def hitung_pembagian(pembilang, penyebut):
try:
# Potensi error terjadi di sini (jika penyebut adalah 0)
hasil = pembilang / penyebut
except ZeroDivisionError:
# Menangkap kasus pembagian dengan nol
print("Error: Tidak dapat membagi dengan nol!")
return None
except TypeError:
# Menangkap jika input bukan angka
print("Error: Pastikan kedua input adalah angka.")
return None
else:
# Dieksekusi jika tidak ada error sama sekali
print("Pembagian berhasil dilakukan.")
return hasil
finally:
# Akan selalu dieksekusi
print("--- Proses kalkulasi selesai ---")
# Percobaan 1: Berhasil
print("Percobaan 1:")
res1 = hitung_pembagian(10, 2)
print(f"Hasil: {res1}\n")
# Percobaan 2: Menimbulkan ZeroDivisionError
print("Percobaan 2:")
res2 = hitung_pembagian(10, 0)
print(f"Hasil: {res2}\n")
# Percobaan 3: Menimbulkan TypeError
print("Percobaan 3:")
res3 = hitung_pembagian(10, "a")
print(f"Hasil: {res3}")
Dalam contoh program exception handling pada Python di atas, kita mengamati bagaimana blok try mengisolasi operasi kritis. Jika pengguna memasukkan 0 sebagai penyebut, program tidak akan berhenti. Sebaliknya, alur eksekusi akan melompat langsung ke blok except ZeroDivisionError, mencetak pesan kesalahan yang informatif, dan memungkinkan program untuk melanjutkan eksekusi (mengembalikan None).
Menggunakan finally sangat penting ketika Anda menangani sumber daya eksternal. Bayangkan jika kode di dalam try melibatkan pembukaan file. Jika terjadi error sebelum file ditutup, file tersebut mungkin tetap terbuka dan menyebabkan kebocoran sumber daya. Dengan menempatkan perintah penutup file di blok finally, kita menjamin bahwa sumber daya dilepaskan, bahkan ketika error terjadi.
Selain menangkap eksepsi bawaan Python, Anda juga bisa mendefinisikan dan memunculkan eksepsi kustom menggunakan perintah raise jika kondisi tertentu terpenuhi, memberikan kontrol granular yang lebih besar atas validasi data atau logika bisnis dalam aplikasi Anda. Pemahaman mendalam tentang exception handling pada Python adalah fondasi untuk membangun aplikasi yang tangguh dan andal.