🐍 📗 Bagian 2 (Struktur Data, OOP & Proyek) • Modul 09 100% Standar Industri & Vokasi

Manajemen File I/O & Exception Handling

Membaca & menulis file dengan context manager 'with open()', mode file (r, w, a), penanganan error terstruktur (try, except, else, finally), dan custom exceptions.

Target Pembelajaran:
  • Memahami protokol Context Manager (__enter__ & __exit__) pada with open().
  • Mampu melakukan serialisasi & parsing data JSON.
  • Menguasai hierarki penangkapan exception yang spesifik.
  • Mampu membuat Class Exception kustom turunan dari Exception.

1. Context Manager & Mode File

Siklus Alokasi dan Pembebasan Resource Berkas Aman dengan with open(...) as f.
Gambar 9.1: Siklus Alokasi dan Pembebasan Resource Berkas Aman dengan with open(...) as f.

Penggunaan statemen with menjamin file descriptor akan dilepas oleh sistem operasi secara otomatis segera setelah blok kode selesai atau jika terjadi crash.

python (kelola_file.py)
# 1. Menulis data teks (encoding="utf-8" wajib untuk mendukung simbol/emoji)
with open("data_user.txt", "w", encoding="utf-8") as f:
    f.write("ID,Nama,Kota\n")
    f.write("101,Rian,Bandung\n")
    f.write("102,Siti,Surabaya\n")

# 2. Membaca baris demi baris secara efisien (Memory Friendly)
with open("data_user.txt", "r", encoding="utf-8") as f:
    for nomor, baris in enumerate(f, 1):
        print(f"Baris {nomor}: {baris.strip()}")

2. Membuat Custom Exception

Pohon Hierarki Kelas Exception Bawaan Python (BaseException -> Exception).
Gambar 9.2: Pohon Hierarki Kelas Exception Bawaan Python (BaseException -> Exception).

Anda dapat membuat jenis exception kustom sendiri dengan mewarisi kelas bawaan Exception untuk merepresentasikan aturan bisnis aplikasi (misal: Saldo Tidak Cukup, Stok Habis).

python (custom_error.py)
# Mendefinisikan Custom Exception
class SaldoTidakCukupError(Exception):
    def __init__(self, saldo, tarik):
        self.saldo = saldo
        self.tarik = tarik
        super().__init__(f"Gagal tarik Rp {tarik:,.0f}! Saldo hanya tersisa Rp {saldo:,.0f}.")

# Penggunaan raise
def proses_penarikan(saldo_saat_ini, nominal):
    if nominal > saldo_saat_ini:
        raise SaldoTidakCukupError(saldo_saat_ini, nominal)
    return saldo_saat_ini - nominal

try:
    sisa = proses_penarikan(100000, 250000)
except SaldoTidakCukupError as err:
    print(f"[ERROR BISNIS] {err}")

3. Garansi Eksekusi Blok `finally`

Flowchart Alur Eksekusi Blok Penanganan Kesalahan: try - except - else - finally.
Gambar 9.3: Flowchart Alur Eksekusi Blok Penanganan Kesalahan: try - except - else - finally.

Blok finally dijamin akan SELALU dieksekusi dalam kondisi apa pun, bahkan jika di dalam blok try terdapat perintah return, break, atau exception yang tidak tertangkap.

python
def uji_finally():
    try:
        print("1. Di dalam try...")
        return "NILAI RETURN"
    finally:
        print("2. Blok FINALLY tetap dijalankan sebelum fungsi selesai!")

hasil = uji_finally()
print("3. Hasil:", hasil)

4. Kuis Pemahaman & Latihan

🧠 Kuis Cepat: Mengapa `except Exception:` lebih baik daripada `except:` kosong?
Klik untuk melihat jawaban & pembahasan
Jawaban: Agar tidak menangkap SystemExit & KeyboardInterrupt
Penjelasan: Menulis except: kosong (bare except) akan menangkap semua sinyal sistem termasuk saat Anda menekan Ctrl + C di terminal (KeyboardInterrupt), sehingga program menjadi tidak bisa dihentikan. Selalu tangkap kelas yang spesifik atau minimal except Exception:.

Tantangan 9: Pembaca File Konfigurasi Aman

Buat fungsi muat_konfigurasi(nama_file) yang membaca file JSON. Tangani kasus jika:
• File tidak ditemukan (FileNotFoundError) → Buat file default baru dengan setting dasar.
• Format JSON rusak (json.JSONDecodeError) → Tampilkan pesan peringatan format salah.

Target: Program tidak boleh crash saat file konfigurasi belum ada atau rusak.
📋 Cheat Sheet: Operasi File & Error Handling
Cheat Sheet
Sintaks / Perintah Keterangan Fungsi
with open(file, "r") as f: Membuka file mode baca dengan penutupan aman otomatis
with open(file, "w") as f: Membuka file mode tulis (menimpa/membuat baru)
with open(file, "a") as f: Membuka file mode append (menambah baris di akhir file)
f.read(), f.readlines() Membaca seluruh isi file teks atau daftar baris string
try: ... except Err as e: Blok penanganan eksepsi runtime agar program tidak crash
finally: Blok bersih-bersih yang pasti dieksekusi apa pun yang terjadi
🛠️ Praktikum Terkait

Jobsheet 06: File I/O, Eksepsi & Mini Proyek Terpadu

Lengkapi proyek perbankan dengan persistensi penyimpanan data akun ke file lokal dan penanganan eksepsi.

⚠️ Perangkap Pemula: File Truncate Mode 'w' & Lupa Menutup File
Waspada Error

Menggunakan mode 'w' (write) secara tidak sengaja menghapus seluruh isi data file yang sudah ada dari awal.

Kode Salah (Memicu Error)
# 1. Mode 'w' menghapus seluruh data lama (Truncate to 0 byte):
f = open("riwayat_log.txt", "w") # Isi lama LANGSUNG TERHAPUS!
f.write("Log aktivitas baru\n")

# 2. Lupa f.close() menyebabkan buffer data hilang saat crash
Solusi Benar & Aman
# Solusi Benar:
# Gunakan mode 'a' (append) untuk menambahkan baris di akhir file
# Gunakan with open() agar file terjamin selalu ditutup otomatis
with open("riwayat_log.txt", "a", encoding="utf-8") as f:
    f.write("Log aktivitas baru\n")
Penyebab & Solusi: Mode 'w' selalu membuat ulang file dari nol. Gunakan mode 'a' jika ingin mempertahankan data lama. Selalu gunakan with open() agar file ditutup aman secara otomatis.
💡 Tips Pythonic: Context Manager with & Exception Spesifik
Standar PEP 8

Gunakan statement with untuk manajemen sumber daya file secara aman dan tangani exception secara terarah.

Kurang Pythonic (Hindari)
# Kurang Pythonic (File tidak terjamin tertutup & bare except)
f = open("catatan.txt", "r")
data = f.read()
f.close() # Jika baris read error, close() tidak pernah dipanggil!

try:
    angka = int(input("Masukkan angka: "))
except: # Menangkap semua error termasuk Ctrl+C (KeyboardInterrupt)
    print("Error!")
Pythonic Way (Direkomendasikan)
# Pythonic (with statement & spesifik Exception)
with open("catatan.txt", "r", encoding="utf-8") as f:
    data = f.read()
# File otomatis ditutup 100% aman bahkan saat terjadi crash

try:
    angka = int(input("Masukkan angka: "))
except ValueError as err:
    print(f"Format angka tidak valid: {err}")
Standar Keamanan: Blok with (Context Manager) menggaransi pembersihan memori dan penutupan file secara instan. Menangkap tipe error spesifik seperti ValueError mencegah tersembunyinya bug tak terduga.
🎯

Cek Pemahaman Mandiri

Uji pemahaman Anda terhadap konsep bab ini dengan feedback evaluasi instan.

2 Soal Pilihan Ganda
Q1

Mengapa penggunaan statement with open(...) sangat direkomendasikan dibanding open() biasa?

💡 Pembahasan: Statement with menggunakan protokol Context Manager yang otomatis memanggil file.close() segera setelah blok selesai dieksekusi atau ketika terjadi error.

Q2

Kapan blok finally dalam struktur try-except-finally akan dieksekusi?

💡 Pembahasan: Blok finally adalah blok pembersihan yang dijamin selalu dieksekusi dalam kondisi apapun, cocok untuk menutup koneksi database atau melepaskan resource sistem.