Fundamental Series — Part 18 of 20
Error pasti terjadi. Memahami cara membaca traceback, menangkap exception, dan debugging secara sistematis adalah skill esensial.
Membaca Traceback
def f(x):
return g(x)
def g(x):
return x / 0
f(5)
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# File "<stdin>", line 2, in f
# File "<stdin>", line 2, in g
# ZeroDivisionError: division by zero
TipBaca Traceback dari Bawah ke Atas
Baris terakhir adalah error. Baris di atasnya menunjukkan urutan pemanggilan fungsi (call stack).
try / except — Menangkap Error
# Tangkap error, lanjut jalan
try:
result = 10 / 0
except ZeroDivisionError:
result = None
# Tangkap multiple exception
try:
result = int("abc")
except (ValueError, TypeError) as e:
result = None
# finally — selalu dijalankan
try:
f = open("data.csv")
except FileNotFoundError:
f = None
finally:
pass # cleanup codeException Types Umum
| Exception | Penyebab |
|---|---|
ValueError |
Nilai tidak valid |
TypeError |
Tipe tidak sesuai |
KeyError |
Key tidak ada di dict |
IndexError |
Index di luar range |
FileNotFoundError |
File tidak ditemukan |
ZeroDivisionError |
Bagi dengan nol |
AttributeError |
Atribut tidak ada |
ImportError |
Modul tidak ditemukan |
raise — Membuat Error Sendiri
def hitung_bmi(berat, tinggi):
if tinggi <= 0:
raise ValueError("Tinggi harus positif!")
if berat <= 0:
raise ValueError("Berat harus positif!")
return berat / tinggi ** 2
hitung_bmi(70, 0) # ValueError: Tinggi harus positif!assert — Cek Kondisi
def analisis(df, kolom):
assert kolom in df.columns, f"Kolom '{kolom}' tidak ada!"
assert df[kolom].dtype in ["int64", "float64"], "Kolom harus numerik!"
return df[kolom].mean()
Penting
assert Bisa Dimatikan
assert bisa di-disable dengan python -O. Jangan pakai untuk validasi input di production — gunakan raise + if.
Debugging dengan breakpoint()
def my_func(x):
breakpoint() # pause di sini (Python 3.7+)
y = x * 2
z = y + 10
return z
# Saat berhenti di debugger (pdb):
# n = next line
# c = continue
# q = quit
# p variable = print variabel
# l = list kode sekitarLogging vs Print
import logging
logging.basicConfig(level=logging.INFO)
def proses_data(df):
logging.info(f"Memproses {len(df)} baris")
logging.warning("Ada missing values!")
logging.error("Kolom X tidak ditemukan")Latihan
BahayaLatihan 18.1
# 1. Buat fungsi safe_divide(a, b):
# - Return a/b jika b != 0
# - Return None jika b == 0 (pakai try/except)
# 2. Buat fungsi safe_convert(s):
# - Coba konversi string ke float
# - Return None jika gagal
# 3. Apply safe_convert ke ["3.14", "abc", "100", "xyz", "0.5"]Ringkasan
| Fitur | Keterangan |
|---|---|
try/except |
Tangkap exception |
raise |
Buat exception |
assert |
Cek kondisi (development) |
finally |
Selalu dijalankan |
breakpoint() |
Interactive debugger |
logging |
Logging terstruktur |
| Traceback | Baca dari bawah ke atas |
Sebelumnya: Part 17 — Apply & Vectorisasi Selanjutnya: Part 19 — Reproducible Workflow