Sejauh ini kode kita mengandaikan dunia selalu rapi: angka tersimpan sebagai angka, berkas selalu ada di tempatnya, daftar tidak pernah kosong. Kenyataan di lapangan berkata lain — kolom jumlah menyimpan teks "tiga", berkas ekspor lupa diunduh, dan hari libur nasional menghasilkan data penjualan kosong. Ketika situasi itu terjadi, Python memunculkan exception: alur program berhenti dan traceback tercetak di layar. Penanganan error memberi kita kendali atas momen tersebut: program analisis tetap berjalan, data bermasalah dicatat jelas, dan pesan yang muncul bisa dibaca manusia. Pada chapter ini kita membahas try-except-else-finally, tipe galat yang paling sering ditemui analis, serta cara menaikkan galat validasi sendiri dengan raise.
Menangkap Galat dengan try dan except #
Konsep dasarnya dua blok: kode berisiko ditaruh di dalam try, dan rencana cadangan ketika galat terjadi ditaruh di dalam except. Skenario paling khas dalam pekerjaan analisis adalah membersihkan data kotor — kita mencoba mengonversi tiap nilai, dan nilai yang gagal dilewati dengan catatan, bukan menghentikan seluruh proses:
data_kotor = ["42", "18", "enam puluh", "30"]
nilai_bersih = []
for teks in data_kotor:
try:
nilai_bersih.append(int(teks))
except ValueError:
print(f"Lewati '{teks}': bukan angka yang valid")
print("Nilai bersih:", nilai_bersih)
print("Rata-rata :", sum(nilai_bersih) / len(nilai_bersih))Output yang Dihasilkan:
Lewati 'enam puluh': bukan angka yang valid
Nilai bersih: [42, 18, 30]
Rata-rata : 30.0Mari kita telaah alurnya:
- Baris 5-6 (
try): untuk tiap teks,int(teks)mencoba konversi. Tiga nilai berhasil;"enam puluh"gagal sehingga Python memunculkanValueError. - Baris 7-8 (
except ValueError): galat tersebut ditangkap, satu baris catatan dicetak, dan perulangan lanjut ke nilai berikutnya — program tidak berhenti. - Baris 10-11: berkat tiga nilai yang selamat, rata-rata masih bisa dihitung. Bandingkan dengan tanpa
try/except: seluruh skrip gagal di elemen ketiga dan kita tidak mendapat hasil apa pun.
Inti pola ini adalah spesifisitas: kita menangkap ValueError, bukan semua galat. Konversi gagal memang hal yang kita duga, sehingga wajar ditangani dengan “lewati dan catat”.
Melengkapi Alur dengan else dan finally #
Dua blok pelengkap membuat alur lengkap dan rapi. Blok else hanya berjalan ketika try berhasil tanpa galat — tempat yang tepat untuk memproses hasil. Blok finally berjalan selalu, berhasil maupun gagal — tempat untuk pembersihan seperti menutup koneksi:
def periksa_jumlah(teks):
try:
jumlah = int(teks)
except ValueError as err:
print(f"Input '{teks}' ditolak: {err}")
else:
print(f"Input '{teks}' diterima: {jumlah} cangkir")
finally:
print("-- pemeriksaan selesai --")
periksa_jumlah("3")
periksa_jumlah("tiga")Output yang Dihasilkan:
Input '3' diterima: 3 cangkir
-- pemeriksaan selesai --
Input 'tiga' ditolak: invalid literal for int() with base 10: 'tiga'
-- pemeriksaan selesai --Pada pemanggilan pertama, int("3") berhasil sehingga blok else berjalan; pada pemanggilan kedua konversi gagal sehingga blok except yang berjalan dengan pesan galat asli dari Python (err) ikut tercetak. Di kedua kasus, blok finally tetap dieksekusi — persis perilaku yang kita inginkan untuk langkah wajib seperti mencatat baris log atau menutup berkas. Kata kunci as err mengikat objek galat ke nama err agar pesannya bisa kita pakai dalam laporan.
Galat yang Sering Ditemui Analis #
Tabel berikut memetakan tipe galat paling umum beserta penyebabnya dalam pekerjaan analisis. Contoh di bawahnya memicu tiga di antaranya secara terkendali — ValueError sudah kita lihat pada bagian pertama:
harga = {"kopi susu": 24, "matcha": 28}
# KeyError: kunci tidak ada di dictionary
try:
print(harga["kopi tubruk"])
except KeyError as err:
print("KeyError:", err, "belum terdaftar di daftar harga")
# FileNotFoundError: berkas tidak ada di folder kerja
try:
with open("stok_bulanan.csv") as berkas:
print(berkas.read())
except FileNotFoundError as err:
print("FileNotFoundError:", err)
# ZeroDivisionError: pembagi nol karena data kosong
penjualan_kosong = []
try:
rata_rata = sum(penjualan_kosong) / len(penjualan_kosong)
except ZeroDivisionError:
print("ZeroDivisionError: data penjualan masih kosong")Output yang Dihasilkan:
KeyError: 'kopi tubruk' belum terdaftar di daftar harga
FileNotFoundError: [Errno 2] No such file or directory: 'stok_bulanan.csv'
ZeroDivisionError: data penjualan masih kosongTabel berikut memetakan tipe galat yang paling umum beserta penyebabnya dalam pekerjaan analisis:
| Galat | Penyebab umum | Contoh saat menganalisis data |
|---|---|---|
ValueError | Tipe sudah sesuai, tetapi isinya tidak bisa diproses | int("tiga") pada kolom jumlah |
TypeError | Operasi antar tipe yang tidak cocok | Menjumlahkan "42" dengan 18 |
KeyError | Kunci tidak ditemukan pada dictionary | Produk baru belum masuk daftar harga |
IndexError | Indeks melebihi jumlah elemen kumpulan | Baris CSV berkolom lebih sedikit dari yang diharapkan |
FileNotFoundError | Berkas tidak ada di jalur yang diminta | stok_bulanan.csv belum diunduh |
ZeroDivisionError | Pembagi bernilai nol | Rata-rata dari daftar penjualan kosong |
Mengenali pasangan tipe-penyebab ini mempercepat diagnosis: begitu KeyError muncul, kita langsung memeriksa pemetaan; begitu ValueError muncul, kita memeriksa isi kolom yang dikonversi — bukan menebak-nebak ke seluruh program.
Menaikkan Galat Sendiri dengan raise #
Kadang galat terbaik justru kita naikkan sendiri. Prinsipnya fail fast: bila input sudah jelas tidak masuk akal, berhenti lebih awal dengan pesan yang jelas jauh lebih murah daripada melanjutkan dan menghasilkan angka yang salah secara diam-diam. Kata kunci raise memunculkan galat dari kode kita:
def validasi_diskon(persen):
if not 0 <= persen <= 1:
raise ValueError(f"diskon harus di antara 0 dan 1, diterima {persen}")
return persen
for kandidat in [0.1, 1.5, -0.2]:
try:
print(f"Diskon {validasi_diskon(kandidat)} siap dipakai")
except ValueError as err:
print(f"Diskon {kandidat} ditolak: {err}")Output yang Dihasilkan:
Diskon 0.1 siap dipakai
Diskon 1.5 ditolak: diskon harus di antara 0 dan 1, diterima 1.5
Diskon -0.2 ditolak: diskon harus di antara 0 dan 1, diterima -0.2Alur kerjanya sebagai berikut:
- Baris 2-3 (
raise ValueError(...)): fungsi memeriksa syarat bisnis sebelum bekerja. Nilai di luar rentang 0 sampai 1 ditolak dengan pesan yang menyebutkan aturan dan nilai yang ditolak. - Baris 7-10 (
try/exceptdi pemanggil): pemanggil memutuskan cara menangani — di sini mencatat penolakan dan melanjutkan kandidat berikutnya. Pemisahan ini sehat: fungsi bertugas menolak input buruk, pemanggil bertugas menentukan reaksi. - Pesan galat sebagai dokumentasi: dari pesan saja kita sudah tahu aturannya dan nilai mana yang melanggar, tanpa membuka ulang isi fungsi.
Dalam proyek analisis yang lebih besar, validasi seperti ini menutup masalah di ambang pintu: satu baris penjualan dengan diskon -0.2 berpotensi merusak seluruh laporan keuangan bila dibiarkan lewat.
Referensi Resmi #
- Dokumentasi pytest — ketika kode analisis mulai diuji otomatis, pytest menyediakan pola memeriksa bahwa validasi kita benar-benar menolak input yang buruk.
Rangkuman #
trymenampung kode berisiko;except TipeSpesifikmenangkap galat yang memang diduga sehingga program analisis bisa lanjut dan data bermasalah tercatat.elseberjalan hanya saattrysukses,finallyberjalan selalu — pasangan yang rapi untuk memproses hasil dan pembersihan.- Tabel tipe-penyebab (
ValueError,TypeError,KeyError,IndexError,FileNotFoundError,ZeroDivisionError) mempercepat diagnosis galat harian. raisemenaikkan galat validasi sendiri; prinsip fail fast menutup masalah sebelum menular ke hasil analisis.- Tulis pesan galat yang menyebutkan aturan dan nilai yang ditolak — ia bekerja sebagai dokumentasi.
Dengan try-except dan raise, program analisis kita kini berhenti dengan sopan saat data bermasalah dan berjalan terus ketika masalahnya memang wajar dilewati. Peralatan inti Python untuk analisis data telah lengkap. Selanjutnya kita berkenalan dengan Dasar Pemrograman Berorientasi Object — memahami class dan object agar kode library seperti pandas dan scikit-learn, yang akan kita pakai di chapter-chapter berikutnya, tidak lagi terasa asing.