Pendamping Bab 15: Menangani Error dengan try dan except. Gunakan nomor contoh dan latihan yang sama dengan buku.

Tujuan Belajar

  • Mengenali exception dan membaca pesannya.
  • Menangani error yang diperkirakan secara spesifik.
  • Membedakan peran else dan finally.

Persiapan

Kamu sudah memahami fungsi, input, dan file. Jalankan contoh dengan data valid serta data yang sengaja salah untuk memeriksa setiap jalur penanganan.

Program dengan tombol Coba di IDE dapat dijalankan di browser. Untuk program lokal, unduh sumber, ekstrak ZIP, lalu ikuti README.txt.

Pembahasan

15-01 – Struktur Dasar `try` dan `except`

Struktur try dan except adalah fondasi utama dalam menangani error di Python. Cara kerjanya sederhana.

Coba di IDE Unduh Sumber
try:
    # Code yang mungkin menimbulkan error kita letakkan di sini
    angka_pembilang = 10
    angka_penyebut = 0  # Ini akan menyebabkan error!
    hasil = angka_pembilang / angka_penyebut
    # Baris berikut tidak akan dijalankan
    print("Hasil pembagian:", hasil)
except:
    # Code ini akan dijalankan jika terjadi error di blok try
    print("Oops! Terjadi kesalahan dalam perhitungan.")

print("Program selesai atau melanjutkan tugas lain...")

Hasil yang diharapkan:

Oops! Terjadi kesalahan dalam perhitungan.
Program selesai atau melanjutkan tugas lain...

Coba ubah: Ubah satu nilai pada contoh, lalu jelaskan pengaruhnya terhadap hasil.

15-02 – Mengakses Pesan Error

Kadang, kita ingin tahu lebih detail tentang error yang terjadi. Kita bisa menangkap objek exception itu sendiri dan menampilkan pesannya.

Coba di IDE Unduh Sumber
try:
    x = int("bukan_angka")
# 'e' menyimpan objek error
except ValueError as e:
    print("Terjadi ValueError!")
    print(f"Pesan error aslinya: {e}")
    print(f"Tipe errornya: {type(e)}")

Hasil yang diharapkan:

Terjadi ValueError!
Pesan error aslinya: invalid literal for int() with base 10: 'bukan_angka'
Tipe errornya: <class 'ValueError'>

Coba ubah: Ubah satu nilai pada contoh, lalu jelaskan pengaruhnya terhadap hasil.

Studi Kasus

15-03 – Pembagian dengan pesan yang jelas

Dua jenis exception mempunyai pesan berbeda. else menampilkan hasil ketika perhitungan berhasil. finally menutup sesi pemeriksaan.

Coba di IDE Unduh Sumber

Masukan uji, berurutan: '12', '3'.

try:
    pembilang = float(input("Pembilang: "))
    penyebut = float(input("Penyebut: "))
    hasil = pembilang / penyebut
except ValueError:
    print("Masukan harus berupa angka.")
except ZeroDivisionError:
    print("Penyebut tidak boleh nol.")
else:
    print(f"Hasil: {hasil}")
finally:
    print("Pemeriksaan selesai.")

Hasil yang diharapkan:

Pembilang: Penyebut: Hasil: 4.0
Pemeriksaan selesai.

Coba ubah: Coba teks abc atau penyebut nol untuk memeriksa kedua except.

Rangkuman

try menjalankan pekerjaan yang dapat menimbulkan exception. except menangani jenis yang sesuai; else berjalan jika try selesai tanpa exception; finally menjalankan pembersihan saat alur meninggalkan blok.

Cek Pemahaman

Lima pertanyaan ini sama dengan pertanyaan di buku. Periksa jawaban di kuis untuk melihat skor dan pembahasan.

  1. Blok untuk menangani exception yang cocok adalah …
  2. int("abc") biasanya menimbulkan …
  3. Pembagian bilangan dengan nol menimbulkan …
  4. Kapan else pada try dijalankan?
  5. Mengapa memilih jenis exception yang spesifik?
Kerjakan Kuis

Latihan Mandiri

Latihan 15-L01 – Konversi gagal

Dasar. Tangani int("abc") dan tampilkan Angka tidak valid.

Kerjakan di IDE Unduh Latihan

Hasil yang diharapkan:

Angka tidak valid
Lihat Petunjuk

Letakkan konversi di dalam try.

Lihat Solusi
teks = "abc"
try:
    angka = int(teks)
except ValueError:
    print("Angka tidak valid")

except ValueError memberikan respons untuk masukan yang tidak sesuai.

Coba Solusi di IDEUnduh Solusi

Latihan 15-L02 – Pembagian aman

Penerapan. Hitung 10 dibagi penyebut 0. Tangani error dengan pesan Tidak bisa dibagi nol.

Kerjakan di IDE Unduh Latihan

Hasil yang diharapkan:

Tidak bisa dibagi nol
Lihat Petunjuk

Tangani ZeroDivisionError.

Lihat Solusi
penyebut = 0
try:
    print(10 / penyebut)
except ZeroDivisionError:
    print("Tidak bisa dibagi nol")

Program tetap dapat menjelaskan masalah tanpa traceback untuk kondisi yang diperkirakan.

Coba Solusi di IDEUnduh Solusi

Latihan 15-L03 – Alur berhasil

Pengembangan. Konversi "12". Jika berhasil, cetak Angka: 12 dari else. Cetak Pemeriksaan selesai dari finally.

Kerjakan di IDE Unduh Latihan

Hasil yang diharapkan:

Angka: 12
Pemeriksaan selesai
Lihat Petunjuk

Tugas setelah konversi berhasil berada di else.

Lihat Solusi
teks = "12"
try:
    angka = int(teks)
except ValueError:
    print("Angka tidak valid")
else:
    print(f"Angka: {angka}")
finally:
    print("Pemeriksaan selesai")

finally tetap dijalankan pada alur biasa saat meninggalkan blok.

Coba Solusi di IDEUnduh Solusi

Pengembangan

Kegiatan Tambahan

Saatnya menguji pemahamanmu! Cobalah kerjakan latihan ini sendiri sebelum mengintip solusinya.

  1. Kalkulator Usia Hewan Peliharaan (Anti Error) Buat program yang meminta pengguna memasukkan usia hewan peliharaan mereka dalam tahun. Program kemudian akan mencoba mengonversi usia tersebut ke “usia manusia” dengan mengalikannya dengan 7 (ini hanya penyederhanaan, ya!).
    • Tangani jika pengguna memasukkan sesuatu yang bukan angka (misalnya “lima”). Beri pesan error yang ramah.
    • Jika input valid, tampilkan hasilnya.
    • Gunakan blok else untuk menampilkan hasil jika konversi berhasil.
    • Gunakan blok finally untuk selalu mengucapkan “Terima kasih telah peduli pada hewanmu!”
  2. Pembaca File Puisi (Anti Panik) Buat program yang meminta nama sebuah file dari pengguna. Program akan mencoba membuka dan membaca isi file tersebut, lalu menampilkannya.
    • Tangani jika file yang dimasukkan pengguna tidak ada (FileNotFoundError). Beri pesan bahwa file tidak ditemukan.
    • Tangani juga error umum lainnya yang mungkin terjadi saat membaca file (gunakan except Exception as e:).
    • Jika file berhasil dibaca, tampilkan isinya.
    • Pastikan file selalu ditutup (jika berhasil dibuka) menggunakan blok finally.
  3. Akses Indeks List Aman Buat sebuah list berisi beberapa nama buah, misalnya buah = ["apel", "mangga", "jeruk", "pisang"]. Minta pengguna memasukkan indeks (angka) untuk melihat buah pada posisi tersebut.
    • Tangani jika input pengguna bukan angka (ValueError).
    • Tangani jika indeks yang dimasukkan berada di luar jangkauan list (IndexError).
    • Jika input valid dan indeks ada dalam jangkauan, tampilkan nama buahnya.
    • Gunakan else untuk menampilkan buah jika berhasil.
    • Gunakan finally untuk menampilkan pesan “Pengecekan buah selesai.”
Petunjuk dan Solusi Pengembangan

Solusi Latihan

Solusi 1: Kalkulator Usia Hewan Peliharaan

#### File: solusi_usia_hewan.py

def hitung_usia_hewan_versi_manusia():
    print("--- Kalkulator Usia Hewan (Versi Manusia Sederhana) ---")
    try:
        prompt = "Masukkan usia hewan (tahun, angka): "
        usia_hewan_str = input(prompt)
        usia_hewan_thn = int(usia_hewan_str)
        # Potensi ValueError

        if usia_hewan_thn < 0:
            # Bisa raise error atau tangani dengan if
            print("Usia hewan tidak boleh negatif, dong!")
            # Untuk kesederhanaan, pakai print saja
            usia_manusia = "Tidak valid (usia negatif)"
        else:
            usia_manusia = usia_hewan_thn * 7
            
    except ValueError:
        print("\\nOops! Kamu harus memasukkan usia")
        print("dalam bentuk ANGKA.")
        usia_manusia = "Tidak dapat dihitung (input salah)"
    else:
        # Hanya jalan jika tidak ada ValueError
        # Cek apakah usia_manusia adalah angka
        is_number = isinstance(usia_manusia, (int, float))
        if is_number:
             print(f"\\nJika hewanmu berusia {usia_hewan_thn} thn,")
             print(f"setara {usia_manusia} thn usia manusia.")
        # Jika usia_manusia adalah string "Tidak valid...",
        # else ini tetap jalan, tapi kita tidak print
        # pesan sukses konversi.
    finally:
        print("\\nTerima kasih telah peduli pada hewanmu!")

if __name__ == "__main__":
    hitung_usia_hewan_versi_manusia()

Solusi 2: Pembaca File Puisi

#### File: solusi_pembaca_puisi.py

def baca_file_puisi():
    print("--- Pembaca File Puisi ---")
    file_obj = None
    # Inisialisasi agar bisa dicek di finally
    try:
        prompt = "Masukkan nama file puisi (misal: puisi.txt): "
        nama_file = input(prompt)
        # Buat file dummy 'puisi.txt' untuk pengujian:
        # Isi puisi.txt:
        # Di bawah langit biru,
        # Angin berbisik merdu.

        file_obj = open(nama_file, "r", encoding="utf-8")
        print(f"\\n--- Isi dari {nama_file} ---")
        isi = file_obj.read()
        if isi:
            print(isi)
        else:
            print("(File kosong)")
        print("--- Selesai membaca ---")
            
    except FileNotFoundError:
        print(f"\\nMaaf, file '{nama_file}' tidak ditemukan.")
        print("Pastikan nama file benar dan ada di direktori.")
    # Menangkap error lain saat membuka atau membaca
    except Exception as e:
        print(f"\\nTerjadi kesalahan saat membaca file: {e}")
    finally:
        if file_obj and not file_obj.closed:
            file_obj.close()
            print("(File ditutup di finally)")
        print("\\nTerima kasih sudah menggunakan")
        print("Pembaca File Puisi!")

if __name__ == "__main__":
    # Untuk mencoba, buat file bernama "puisi.txt"
    # di folder yang sama dengan script ini.
    # Isi file dengan beberapa baris puisi.
    # Contoh isi "puisi.txt":
    #   Di atas awan, ku melayang,
    #   Melihat dunia, begitu terang.
    baca_file_puisi()

Catatan untuk Solusi 2: Contoh ini sengaja memakai open() dan close() manual agar peran finally terlihat jelas. Dalam proyek nyata, with open(...) biasanya lebih disarankan karena file otomatis ditutup.

Solusi 3: Akses Indeks List Aman

#### File: solusi_akses_list.py

def akses_buah_dari_list():
    buah = ["apel", "mangga", "jeruk", "pisang",
            "semangka", "durian"]
    print("--- Pilih Buah Favoritmu dari List ---")
    print(f"Daftar buah yang tersedia: {buah}")

    try:
        max_idx = len(buah) - 1
        prompt = f"Masukkan nomor urut (0-{max_idx}): "
        indeks_str = input(prompt)
        indeks_int = int(indeks_str)
        # Potensi ValueError

        if indeks_int < 0:
            raise IndexError

        buah_pilihan = buah[indeks_int]
        # Potensi IndexError

    except ValueError:
        print("\\nInput salah! Kamu harus memasukkan")
        print("nomor (angka) sebagai indeks.")
    except IndexError:
        print(f"\\nNomor urut {indeks_int} tidak ada dalam daftar!")
        print(f"Pilih nomor antara 0 dan {len(buah) - 1}.")
    except Exception as e:
        print(f"\\nTerjadi error tak terduga: {e}")
    else:
        # Hanya jalan jika tidak ada error
        print(f"\\nSelamat! Kamu memilih: {buah_pilihan}")
    finally:
        print("\\nPengecekan buah selesai.")
        print("Semoga harimu menyenangkan!")

if __name__ == "__main__":
    akses_buah_dari_list()

Dengan menguasai try, except, else, dan finally, program Python-mu akan menjadi jauh lebih kuat, tidak mudah “ngambek” atau crash, dan pastinya memberikan pengalaman yang lebih baik bagi siapa saja yang menggunakannya. Ini adalah salah satu ciri programmer yang handal!

Di bab berikutnya, kita akan pelajari cara mengelola modul dan paket. Ini akan membantu kita menyusun program yang lebih besar menjadi beberapa file yang lebih terorganisir dan memungkinkan kita menggunakan ulang code dengan lebih mudah. Siap untuk petualangan berikutnya?

Referensi dan Materi Pendamping

Langkah Selanjutnya

Bab 16 membahas Fungsi Bawaan dan Modul Standar. Sebelum melanjutkan, pastikan kamu dapat menjelaskan tujuan belajar dan menyelesaikan tiga latihan inti bab ini.

Edisi September 2026. Nomor contoh, pertanyaan, dan latihan digunakan bersama pada buku dan halaman ini.

Bab 14 | Bab 16