Soal 1Manakah yang merupakan contoh syntax error?
Menangkap Exception dengan try / except
Pelajari penanganan exception Python dengan try / except / finally untuk menjaga program tetap berjalan saat error muncul.
try / except adalah mekanisme yang menangkap error yang muncul saat runtime dan menjaga program tetap berjalan alih-alih membiarkannya crash. Pakai untuk operasi yang diperkirakan kadang gagal — pengambilan data eksternal, validasi input pengguna, operasi file, dan sejenisnya.
Syntax error vs. runtime error
Python memiliki dua jenis error besar. Syntax error terjadi ketika kode melanggar tata bahasa Python dan ditangkap sebelum program berjalan. Runtime error (exception) secara tata bahasa sah tetapi muncul saat program berjalan. Hanya runtime error yang bisa ditangkap dengan try / except.
Syntax error ditangkap saat Python membaca kode, jadi program tidak pernah berjalan. Runtime error baru muncul ketika eksekusi benar-benar mencapai baris itu — itulah sebabnya try / except bisa mencegatnya.
# Syntax error: titik dua hilang. Gagal bahkan sebelum baris itu berjalan
# if x > 0
# print("positif")
# Runtime error: tata bahasa benar, tapi gagal saat runtime
x = 100
print(x / 0) # ZeroDivisionError: division by zero
print("baris ini tidak pernah berjalan")
Ketika runtime error muncul, semuanya setelah baris itu dilewati. Jalankan snippet berikut dan kamu akan melihat print() terakhir tidak berjalan — program berhenti di IndexError.
# Mengonfirmasi runtime error: tanpa try, program berhenti
numbers = [10, 20, 30]
print(numbers[10]) # IndexError: list index out of range
print("baris ini tidak pernah berjalan")
# Output:
# Traceback (most recent call last):
# File "...", line 3, in <module>
# IndexError: list index out of range
Dasar try / except
Letakkan kode berisiko di blok try: dan kode pemulihan di blok except ErrorClass:.
Begitu error muncul di try, sisa badan try dilewati dan kontrol melompat ke except yang cocok. Kode setelah except tetap berjalan bahkan ketika terjadi error.
Jalankan badan try. Jika tidak ada exception yang muncul, except dilewati dan kontrol mengalir ke sisa program. Jika exception muncul, sisa badan try dilewati, except yang cocok berjalan, lalu kontrol berlanjut sesudahnya.
# Membungkus dengan try menjaga program tetap jalan meski pembagian dengan nol muncul
a = 100
try:
result = a / 0
print(result) # tidak pernah tercapai
except ZeroDivisionError:
print("Tidak bisa bagi dengan 0") # kontrol melompat ke sini
print("setelah blok try") # selalu berjalan setelah try / except
# Output: Tidak bisa bagi dengan 0
# setelah blok try
Menangkap objek exception dengan as e
Menulis except ErrorClass as e: memasukkan detail exception ke e. print(e) menampilkan pesan error, dan type(e) menampilkan kelas error-nya. Mencatat keduanya adalah titik awal yang solid untuk menelusuri masalah nanti.
user_input = "abc" # seharusnya angka, tapi yang datang string
try:
value = int(user_input)
except ValueError as e:
print("Input bukan angka")
print(f"Detail: {e}")
print(f"Jenis: {type(e).__name__}")
# Output: Input bukan angka
# Detail: invalid literal for int() with base 10: 'abc'
# Jenis: ValueError
Pesan saja tidak memberitahumu di mana error muncul, jadi saat debugging standarnya adalah memasangkannya dengan import traceback. traceback.format_exc() mengembalikan jalur panggilan (stack trace) pada saat exception muncul, dan mencatatnya membuat analisis akar penyebab jauh lebih mudah.
import traceback
try:
value = int("abc")
except ValueError as e:
print(f"Detail: {e}")
print(f"Jenis: {type(e).__name__}")
print("--- traceback ---")
print(traceback.format_exc())
# Output:
# Detail: invalid literal for int() with base 10: 'abc'
# Jenis: ValueError
# --- traceback ---
# Traceback (most recent call last):
# File "...", line 4, in <module>
# value = int("abc")
# ValueError: invalid literal for int() with base 10: 'abc'
Beberapa blok except dan Exception sebagai payung
Kamu bisa menumpuk beberapa blok except pada satu try. Yang cocok pertama akan berjalan, jadi idiomnya adalah menuliskannya dari paling spesifik ke paling umum.
Setiap runtime error mewarisi dari Exception, jadi except Exception as e: menangkap apa pun, termasuk error yang tidak terduga.
numbers = [10, 20, 30]
index = 1
divisor = 0
try:
value = numbers[index]
print(value / divisor)
except IndexError as e:
print(f"Indeks di luar jangkauan: {e}")
except ZeroDivisionError as e:
print(f"Tidak bisa bagi dengan 0: {e}")
except Exception as e:
print(f"Error lain: {type(e).__name__}: {e}")
# Output: Tidak bisa bagi dengan 0: division by zero
Jangan letakkan Exception di depan
Exception adalah parent hampir semua exception, jadi meletakkannya di atas mencegah except yang lebih spesifik setelahnya berjalan. Pakai ia sebagai jaring pengaman terakhir untuk error yang tidak terduga.
Menjalankan cleanup dengan finally
Blok finally: adalah slot cleanup yang selalu berjalan, apakah exception muncul atau tidak. Pakai untuk melepaskan sumber daya yang harus ditutup — file, koneksi DB, dan sejenisnya.
Blok else: berjalan hanya ketika tidak ada exception. Tidak terlalu sering dipakai, tapi ia membuat jalur "hanya saat sukses, lanjutkan" menjadi eksplisit.
Setelah try berjalan: tanpa exception → ke else, dengan exception → ke except yang cocok. Apa pun jalurnya, finally selalu berjalan di akhir — itu kuncinya.
# Jalur happy: else dan finally berjalan
a, b = 10, 2
try:
result = a / b
except ZeroDivisionError:
print("Tertangkap bagi dengan nol")
else:
print(f"Sukses: {result}")
finally:
print("Menjalankan cleanup")
# Output: Sukses: 5.0
# Menjalankan cleanup
print("---")
# Jalur error: except dan finally berjalan
a, b = 10, 0
try:
result = a / b
except ZeroDivisionError:
print("Tertangkap bagi dengan nol")
else:
print(f"Sukses: {result}")
finally:
print("Menjalankan cleanup")
# Output: Tertangkap bagi dengan nol
# Menjalankan cleanup
Di artikel ini kamu belajar dasar penanganan exception dengan try / except, cara menangkap info exception dengan as e, cara menumpuk beberapa blok except dan memakai Exception sebagai penangkap umum, dan cara menjalankan cleanup dengan finally. Berikutnya: memunculkan exception sendiri dengan raise, dan mendefinisikan kelas exception kustom.
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Apa yang dicetak kode berikut?a = 100
try:
print(a / 0)
except ZeroDivisionError:
print("tertangkap")
print("selesai")
Soal 3Dari try / except / else / finally, mana yang selalu berjalan terlepas apakah exception muncul atau tidak?