IF5100 Pemrograman untuk Data Analitik
6.1 (concept) Name the exception each raises: (a) [1,7,4][4]; (b) int("hello"); (c) undefined_var; (d) "a" / 4; (e) 1 / 0.
6.2 (write) Wrap two int(input(...)) reads and a division in try/except with separate handlers for ValueError and ZeroDivisionError, plus a catch-all.
6.3 (concept) The deck lists three ways to handle a bad case in avg(grades): print a warning, return 0.0, or re-raise. Give a situation where each is the right choice.
6.4 (trace) What prints, in what order?
try:
print("A")
x = 1 / 0
print("B")
except ZeroDivisionError:
print("C")
else:
print("D")
finally:
print("E")6.5 (write, assertion) Rewrite avg(grades) to use an assert guaranteeing a non-empty list, with a message.
6.6 (concept) When should you use an assertion versus raising/handling an exception? (Hint: programmer error vs. expected bad user input.)
6.1. Pembahasan:
- (a)
[1,7,4][4]→IndexError(indeks 4 di luar jangkauan list berpanjang 3). - (b)
int("hello")→ValueError(string tidak bisa diparsing jadi integer). - (c)
undefined_var→NameError(nama belum pernah didefinisikan). - (d)
"a" / 4→TypeError(operator/tidak didukung antarastrdanint). - (e)
1 / 0→ZeroDivisionError.
6.2.
try:
a = int(input("Masukkan bilangan pertama: "))
b = int(input("Masukkan bilangan kedua: "))
print(a / b)
except ValueError:
print("Input harus berupa bilangan bulat yang valid")
except ZeroDivisionError:
print("Tidak bisa membagi dengan nol")
except Exception as e:
print("Terjadi kesalahan tak terduga:", e)Urutan except penting: klausa yang lebih spesifik (ValueError, ZeroDivisionError) diletakkan sebelum catch-all (Exception) — Python mencoba klausa except dari atas ke bawah dan memakai yang pertama cocok.
6.3. Pembahasan:
- Cetak peringatan (lalu lanjut dengan nilai default/di-skip) — cocok untuk tooling interaktif/skrip eksplorasi di mana pengguna langsung melihat output dan bisa menilai sendiri apakah data kosong itu wajar (misal notebook analisis data).
- Kembalikan
0.0— cocok kalau pemanggil (kode lain) mengharapkan sebuah angka untuk dipakai lebih lanjut dalam komputasi (misal dijumlahkan ke total), dan nilai kosong = 0 adalah asumsi bisnis yang wajar/terdokumentasi (misal: siswa tanpa nilai dianggap kontribusi 0 ke rata-rata kelas). - Re-raise (memicu ulang) exception — cocok untuk library/fungsi reusable di mana keputusan “apa yang harus terjadi kalau data kosong” bukan tanggung jawab fungsi ini, melainkan pemanggilnya — biarkan pemanggil yang tahu konteks memutuskan (catch dan tangani, atau biarkan program berhenti karena ini memang bug).
6.4. Kode verifikasi:
try:
print("A")
x = 1 / 0
print("B")
except ZeroDivisionError:
print("C")
else:
print("D")
finally:
print("E")Output: A, C, E (dalam urutan itu).
print("A")dieksekusi.1 / 0memicuZeroDivisionError— eksekusi langsung lompat ke blokexceptyang cocok, sehinggaprint("B")tidak pernah dijalankan.except ZeroDivisionErrorcocok →print("C").- Klausa
elsehanya dijalankan jika bloktryselesai tanpa exception — di sini terjadi exception, jadielse(danprint("D")) dilewati. finallyselalu dijalankan terakhir, ada exception atau tidak →print("E").
6.5.
def avg(grades):
assert len(grades) != 0, "avg() dipanggil dengan list nilai kosong"
return sum(grades) / len(grades)6.6. Pembahasan: Gunakan assert untuk memeriksa kondisi yang seharusnya selalu benar jika kode di sekitarnya (dan pemanggilnya) tidak punya bug — kegagalannya menandakan kesalahan programmer (programmer error), bukan kondisi yang wajar terjadi saat program berjalan normal, misalnya prasyarat internal fungsi atau invarian struktur data. Gunakan exception (raise/try-except) untuk kondisi yang bisa terjadi secara sah akibat masukan dari luar kendali kode — input pengguna, isi file, respons jaringan — di mana program diharapkan menangani atau memberi tahu penggunanya dengan cara yang baik, bukan sekadar berhenti mendadak. Aturan praktis dari petunjuk soal: programmer error → assert; masukan buruk yang diharapkan/wajar terjadi → exception.