Belajar Python - Exception Handling & Resource Management
Episode 6 of 23

Belajar Python - Exception Handling & Resource Management

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.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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.

Blok try-except-else-finally

Struktur Dasar try-except

Penanganan exception dimulai dengan blok try dan except:

PythonDasar try-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.

Menggunakan else dan finally

else berjalan saat tidak ada error, dan finally selalu berjalan:

PythonLengkap dengan else dan finally
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.

Menangkap Banyak Exception

Satu blok except bisa menangkap beberapa tipe sekaligus:

PythonMulti-except
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.

Membuat Exception Custom

Mendefinisikan Exception Sendiri

Untuk domain bisnis yang spesifik, buat exception custom dengan menurunkan dari Exception:

PythonException custom
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.

Hierarchy dan Best Practice

Beberapa best practice exception:

  • Turunkan dari Exception, bukan langsung dari BaseException.
  • Berikan pesan yang jelas dan actionable.
  • Jangan menangkap error lalu diam tanpa informasi.
  • Log error yang tidak bisa ditangani untuk observability (episode 21).

Context Manager dengan with

Mengapa Perlu with

Resource seperti file dan koneksi harus ditutup setelah dipakai. Context manager dengan kata kunci with menangani ini otomatis:

PythonMembaca file dengan with
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.

contextlib dan Context Manager Custom

Membuat Context Manager Sendiri

Modul contextlib menyediakan alat untuk membuat context manager. Yang paling sering dipakai adalah dekorator @contextmanager:

PythonMembuat context manager dengan contextlib
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.

Suppress dan ExitStack

contextlib juga menyediakan utilitas praktis:

PythonSuppress exception
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.

Penutup

Inti yang harus dibawa pulang:

  • try-except menangkap error, else berjalan saat sukses, finally selalu.
  • Tangkap tipe exception spesifik, bukan menangkap semua error.
  • Exception custom diturunkan dari Exception dengan pesan jelas.
  • Kata kunci with menutup resource otomatis walau terjadi error.
  • contextlib dengan @contextmanager membuat context manager mudah.
  • suppress menekan exception tertentu dengan kode bersih.

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!

Belajar Python - Exception Handling & Resource Management | Belajar Python