Episode ini membahas penanganan error Python: try, except, else, dan finally, serta pembuatan exception custom. Kalian juga belajar context manager dengan kata kunci with dan modul contextlib untuk membuat context manager sendiri.

Program yang baik bukan program yang bebas error, tapi program yang menangani error dengan benar. Episode 6 membekali kalian dengan exception handling dan resource management — dua keterampilan yang menentukan kualitas production code.
Kita akan membedah blok try, except, else, dan finally, membuat exception custom, memakai context manager dengan kata kunci with, dan menggunakannya untuk mengelola resource seperti file dan koneksi database.
Penanganan exception dimulai dengan blok try dan except:
try:
angka = int("bukan angka")
except ValueError:
print("terjadi error konversi")Blok try: berisi kode yang mungkin error, dan except ValueError menangkap error spesifik tersebut. Menangkap tipe exception yang spesifik lebih baik daripada menangkap semua error secara membabi buta.
else berjalan saat tidak ada error, dan finally selalu berjalan:
def bagi(a, b):
try:
hasil = a / b
except ZeroDivisionError:
print("pembagi tidak boleh nol")
return None
else:
print("hasil:", hasil)
return hasil
finally:
print("selalu dieksekusi")
print(bagi(10, 2))
print(bagi(10, 0))Pemanggilan bagi(10, 2) memicu blok else karena tidak ada error, sedangkan bagi(10, 0) memicu except. Blok finally dieksekusi di kedua kasus — tempat ideal untuk membersihkan resource.
Satu blok except bisa menangkap beberapa tipe sekaligus:
try:
data = [1, 2, 3]
print(data[5])
hasil = 10 / 0
except (IndexError, ZeroDivisionError) as err:
print("error:", err)except (IndexError, ZeroDivisionError) as err menangkap dua tipe error sekaligus dan menyimpan objek exception di err. Ini mencegah penulisan blok except yang berulang.
Untuk domain bisnis yang spesifik, buat exception custom dengan menurunkan dari Exception:
class SaldoTidakCukup(Exception):
pass
def tarik(saldo, jumlah):
if jumlah > saldo:
raise SaldoTidakCukup(f"saldo {saldo} tidak cukup untuk {jumlah}")
return saldo - jumlah
try:
print(tarik(5000, 10000))
except SaldoTidakCukup as err:
print("gagal:", err)class SaldoTidakCukup(Exception) mendefinisikan tipe error baru. Memakai raise SaldoTidakCukup(...) untuk melemparkannya. Exception custom membuat pemanggil bisa menangkap error domain secara spesifik.
Beberapa best practice exception:
Exception, bukan langsung dari BaseException.Resource seperti file dan koneksi harus ditutup setelah dipakai. Context manager dengan kata kunci with menangani ini otomatis:
with open("contoh.txt", "w") as f:
f.write("halo python")
with open("contoh.txt", "r") as f:
isi = f.read()
print(isi)with open("contoh.txt", "w") as f: membuka file dan menjamin ditutup otomatis, bahkan jika terjadi error di dalam blok. Tanpa with, kalian harus memanggil f.close() manual yang rawan terlupa.
Modul contextlib menyediakan alat untuk membuat context manager. Yang paling sering dipakai adalah dekorator @contextmanager:
from contextlib import contextmanager
@contextmanager
def pengatur_waktu(nama):
import time
mulai = time.perf_counter()
try:
yield
finally:
lama = time.perf_counter() - mulai
print(f"{nama}: {lama:.4f} detik")
with pengatur_waktu("proses"):
total = sum(range(1_000_000))@contextmanager mengubah generator menjadi context manager. Kode sebelum yield adalah setup, dan kode setelah yield di dalam finally adalah cleanup. with pengatur_waktu("proses"): memakainya seperti context manager bawaan.
contextlib juga menyediakan utilitas praktis:
from contextlib import suppress
with suppress(FileNotFoundError):
isi = open("tidak_ada.txt").read()
print(isi)
print("tidak error")suppress(FileNotFoundError) menekan exception yang ditentukan tanpa perlu blok try. Ini membuat kode lebih bersih saat memang ingin mengabaikan error tertentu. ExitStack berguna untuk mengelola banyak context manager secara dinamis.
Inti yang harus dibawa pulang:
Di episode 7 selanjutnya kita akan membahas modularisasi, packaging dasar, dan virtual environments — membuat package, setup.cfg atau pyproject.toml minimal, pip install -e untuk pengembangan, dan workflow virtual environment. Ini jembatan dari script menjadi project yang terstruktur!