Error Handling: try/except/else/finally
Bikin skrip data yang tidak gampang mati: tangkap error dengan elegan, kenali error khas data, dan tutup resource dengan benar.
Sabuk Pengaman untuk Skrip Datamu
Skrip analisis tanpa error handling itu seperti mengemudi tanpa sabuk pengaman. Lancar-lancar saja sampai satu baris data rusak menabrak semuanya, dan program berhenti di tengah jalan tanpa pesan yang jelas.
Kenapa penting untuk data analyst? Karena kamu memproses ribuan baris dari sumber yang tidak kamu kendalikan: file Excel dari tim lain, API yang kadang timeout, kolom angka yang ternyata berisi teks. Error handling mengubah crash misterius menjadi pesan yang bisa ditindaklanjuti, dan seringkali membuat skrip tetap jalan sambil mencatat baris bermasalah.
Anatomi Lengkap: try/except/else/finally
Empat blok ini punya peran masing-masing yang rapi.
try:
angka = int(input("Masukkan angka: "))
except ValueError:
print("Itu bukan angka yang valid!")
else:
print(f"Kuadratnya: {angka ** 2}")
finally:
print("Program selesai.")Alurnya: try berisi kode berisiko, except jalan kalau error terjadi, else jalan kalau TIDAK ada error (tempat yang tepat untuk logika lanjutan), finally SELALU jalan untuk beres-beres.
Contoh yang lebih dekat ke data, membaca file dengan aman:
try:
with open("penjualan.csv") as f:
baris = f.readlines()
except FileNotFoundError:
print("File penjualan.csv tidak ditemukan, cek nama filenya.")
else:
print(f"Berhasil baca {len(baris)} baris.")Tiga Error yang Paling Sering Ditemui Analyst
Hafalkan tiga ini karena mereka akan jadi teman (atau musuh) harianmu.
# 1. ValueError: konversi tipe gagal
try:
harga = int("12a500") # ada huruf nyempil
except ValueError:
print("Gagal konversi: ada karakter non-angka")
# 2. KeyError: kunci dictionary tidak ada
data = {"nama": "Budi", "umur": 25}
try:
print(data["kota"])
except KeyError:
print("Kolom 'kota' tidak ada di data ini")
# 3. FileNotFoundError: file tidak ketemu
try:
open("data_2024.xlsx")
except FileNotFoundError:
print("File tidak ditemukan, periksa path-nya")Pola realistis, memproses list data kotor tanpa berhenti di baris rusak:
data_kotor = ["15000", "20000", "rusak", "30000", "", "25000"]
bersih = []
gagal = []
for item in data_kotor:
try:
bersih.append(int(item))
except ValueError:
gagal.append(item)
print(f"Bersih: {bersih}") # [15000, 20000, 30000, 25000]
print(f"Gagal: {gagal}") # ['rusak', '']Catatan teknis:
except Exceptionmenangkap hampir semua error, tapi menangkapBaseExceptionjuga akan menelanKeyboardInterrupt(Ctrl+C), sehingga program jadi susah dihentikan paksa. Tangkap error yang spesifik sebisa mungkin.
Jebakan Umum
SALAH, except kosong yang menelan semua error diam-diam:
# Jangan: error hilang tanpa jejak, debugging jadi mimpi buruk
try:
hasil = 100 / 0
except:
passBENAR, tangkap spesifik dan beri pesan atau catat:
# Lakukan: error tercatat, program tetap jalan
try:
hasil = 100 / 0
except ZeroDivisionError as e:
print(f"Pembagian nol terdeteksi: {e}")
hasil = 0SALAH, menaruh logika normal di dalam try:
# Jangan: blok try terlalu gemuk, susah tahu baris mana yang error
try:
data = open("data.csv").read()
baris = data.splitlines()
total = sum(int(b) for b in baris)
rata = total / len(baris)
print(f"Rata-rata: {rata}")
except Exception:
print("Ada yang salah")BENAR, try seminimal mungkin, logika di else:
# Lakukan: hanya operasi berisiko di try
try:
data = open("data.csv").read()
except FileNotFoundError:
print("File tidak ada")
else:
baris = data.splitlines()
total = sum(int(b) for b in baris)
print(f"Rata-rata: {total / len(baris)}")Tantangan
Pembersih data dengan pencatat error
Buat fungsi bersihkan_angka(daftar) yang mengubah tiap string menjadi integer. String yang gagal konversi (ValueError) jangan membuat fungsi berhenti, tapi dikumpulkan ke list gagal. Fungsi mengembalikan tuple (list_bersih, list_gagal). Uji dengan ["10", "xx", "20", "", "30"].
Kuis Bab
Uji pemahamanmu: Bab 2: Alur Program dan Fungsi
Jawab 5 soal berikut, lalu tekan "Periksa Jawaban".
1.Angka apa saja yang dihasilkan list(range(2, 10, 3))?
2.Apa beda break dan continue di dalam loop?
3.Apa hasil dari [x * 2 for x in range(4)]?
4.Kapan blok else pada try/except/else dijalankan?
5.Apa yang dikembalikan fungsi yang tidak punya pernyataan return?