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.
- Memahami protokol Context Manager (
__enter__&__exit__) padawith 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
Penggunaan statemen with menjamin file descriptor akan dilepas oleh sistem operasi secara otomatis segera setelah blok kode selesai atau jika terjadi crash.
# 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
Anda dapat membuat jenis exception kustom sendiri dengan mewarisi kelas bawaan Exception untuk merepresentasikan aturan bisnis aplikasi (misal: Saldo Tidak Cukup, Stok Habis).
# 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`
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.
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
Klik untuk melihat jawaban & pembahasan
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.
| 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 |
Jobsheet 06: File I/O, Eksepsi & Mini Proyek Terpadu
Lengkapi proyek perbankan dengan persistensi penyimpanan data akun ke file lokal dan penanganan eksepsi.
Menggunakan mode 'w' (write) secara tidak sengaja menghapus seluruh isi data file yang sudah ada dari awal.
# 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:
# 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")
'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.
Gunakan statement with untuk manajemen sumber daya file secara aman dan tangani exception secara terarah.
# 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 (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}")
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.
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.
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.