Artikel ini bagian dari seri Belajar Python Level Basic di hanifmu.com. Di artikel sebelumnya kita sudah membahas Syntax Error vs Exception. Sekarang kita pelajari cara menanganinya.
Program yang hanya berhenti saat error belum selesai. Pengguna tetap harus mendapat jawaban, dan pekerjaan yang sudah berjalan tidak boleh hilang begitu saja. Di sinilah try dan except berperan.
Struktur try dan except
try berisi kode yang berpotensi menimbulkan error. Kalau error benar-benar terjadi, Python tidak berhenti, melainkan melompat ke blok except:
try:
angka = int(input("Masukkan angka: "))
print(f"Kamu memasukkan {angka}")
except:
print("Itu bukan angka yang valid")
Bentuk dasarnya seperti ini:
try:
kode yang mungkin error
except:
kode yang dijalankan kalau error
Tanpa try, input seperti abc akan menghentikan program dengan ValueError. Dengan try, program tetap hidup dan bisa memberi pesan yang ramah.
Menangkap Exception Spesifik
Menulis except tanpa jenis exception memang singkat, tapi kurang baik. Ia menangkap semua error, termasuk yang tidak kamu duga, sehingga masalah asli bisa tersembunyi.
Sebutkan jenis exception yang ingin ditangani:
try:
angka = int(input("Masukkan angka: "))
hasil = 100 / angka
print(f"Hasil: {hasil}")
except ValueError:
print("Input harus berupa angka")
except ZeroDivisionError:
print("Tidak bisa membagi dengan nol")
Dengan cara ini, setiap masalah punya penanganannya sendiri. Kalau muncul exception lain di luar kedua jenis itu, Python tetap melaporkannya sehingga kamu tahu ada yang belum tertangani.
Beberapa except juga bisa digabung bila penanganannya sama:
try:
data = {"nama": "Budi"}
print(data["umur"])
except (KeyError, IndexError):
print("Data yang dicari tidak ada")
Mengambil Pesan Exception
Kamu bisa menangkap objek exception untuk membaca pesannya:
try:
angka = int("abc")
except ValueError as e:
print(f"Terjadi kesalahan: {e}")
Output:
Terjadi kesalahan: invalid literal for int() with base 10: 'abc'
Objek e berguna saat kamu ingin mencatat pesan asli, misalnya ke file log.
else
Blok else dijalankan kalau tidak ada exception sama sekali. Ia dipakai untuk memisahkan kode yang berisiko dari kode lanjutan:
try:
angka = int(input("Masukkan angka: "))
except ValueError:
print("Input harus berupa angka")
else:
print(f"Angka yang kamu masukkan: {angka}")
Kode di else hanya berjalan saat konversi berhasil. Ini membuat bagian try tetap pendek dan fokus pada operasi yang memang berisiko.
finally
Blok finally selalu dijalankan, baik ada exception maupun tidak. Ia cocok untuk pekerjaan yang harus selesai apa pun yang terjadi, misalnya menutup file atau koneksi:
try:
file = open("data.txt", "r")
isi = file.read()
print(isi)
except FileNotFoundError:
print("File tidak ditemukan")
finally:
print("Selesai memproses file")
Output saat file tidak ada:
File tidak ditemukan
Selesai memproses file
Perhatikan bahwa finally tetap berjalan meski except sudah menangani error.
Urutan Lengkap
Keempat blok bisa dipakai bersama dengan urutan tetap: try, except, else, finally.
def baca_angka(teks):
try:
angka = int(teks)
except ValueError:
print(f"'{teks}' bukan angka")
return None
else:
print("Konversi berhasil")
return angka
finally:
print("Selesai mencoba konversi")
print(baca_angka("25"))
print(baca_angka("abc"))
Output:
Konversi berhasil
Selesai mencoba konversi
25
'abc' bukan angka
Selesai mencoba konversi
None
Praktik Terbaik
Menangani error bukan berarti menelan semua masalah. Beberapa kebiasaan berikut membuat kode lebih sehat:
- Tangkap exception yang spesifik. Hindari
except:tanpa jenis. - Jangan biarkan blok
tryterlalu panjang. Semakin pendek, semakin jelas bagian mana yang berisiko. - Beri pesan yang berguna. “Input harus berupa angka” lebih membantu daripada “Error”.
- Jangan pakai exception untuk alur normal. Gunakan
ifuntuk kondisi yang bisa diperiksa lebih dulu. - Gunakan
finallyatauwithuntuk sumber daya. File dan koneksi harus ditutup.
Contoh menangani input berulang sampai benar:
while True:
try:
umur = int(input("Masukkan umur: "))
break
except ValueError:
print("Umur harus berupa angka, coba lagi")
print(f"Umur kamu {umur} tahun")
Pola ini sering dipakai di program interaktif agar pengguna bisa memperbaiki kesalahannya tanpa mengulang dari awal.
Contoh Program: Kalkulator Aman
Mari gabungkan semuanya dalam kalkulator yang tidak mudah berhenti:
# kalkulator_aman.py
def hitung(a, b, operator):
if operator == "+":
return a + b
elif operator == "-":
return a - b
elif operator == "*":
return a * b
elif operator == "/":
return a / b
else:
raise ValueError(f"Operator tidak dikenal: {operator}")
try:
a = float(input("Angka pertama: "))
b = float(input("Angka kedua: "))
op = input("Operator (+, -, *, /): ")
hasil = hitung(a, b, op)
print(f"Hasil: {hasil}")
except ValueError as e:
print(f"Input tidak valid: {e}")
except ZeroDivisionError:
print("Tidak bisa membagi dengan nol")
Program ini menangani input yang bukan angka, operator yang salah, dan pembagian dengan nol. Pesan yang muncul pun menjelaskan masalahnya.
Kesalahan Umum Pemula
- Menangkap semua exception —
except:menyembunyikan bug yang sebenarnya perlu diperbaiki. - Blok
tryterlalu luas — sulit tahu baris mana yang gagal. - Mengabaikan exception tanpa memberi tahu pengguna — program terlihat jalan padahal ada yang gagal diam-diam.
- Memakai
finallyuntukreturn—returndifinallymenimpa nilai daritry, hindari. - Mengira
elseselalu jalan —elsehanya jalan kalau tidak ada exception.
Ringkasan
trymembungkus kode berisiko,exceptmenangani error yang muncul- Tangkap exception spesifik seperti
ValueErroratauZeroDivisionError elseberjalan saat tidak ada error,finallyselalu berjalan- Urutannya tetap:
try,except,else,finally - Jangan menelan exception tanpa alasan, dan jaga blok
trytetap pendek
Langkah Selanjutnya
Kamu sudah bisa menangani error yang datang dari luar, misalnya input pengguna yang salah. Tapi program juga bisa sengaja menandai masalahnya sendiri ketika ada aturan yang dilanggar.
Artikel selanjutnya membahas Membangkitkan Exception di Python, cara memakai raise dan membuat exception sendiri.
