Pada saat menulis dan menjalankan program, kita sering dihadapkan pada munculnya kesalahan atau error. Seringkali error menyebabkan program berhenti sendiri.
Error dapat terjadi akibat kesalahan struktur (sintaks) program. Hal ini disebut syntax error. Contohnya adalah seperti berikut:
>>> if x < 5
File "<stdin>", line 1
if x < 5
^
SyntaxError: invalid syntax
Kita bisa melihat bahwa penyebabnya adalah lupa titik dua pada pernyataan if.
Error juga dapat terjadi pada saat runtime (saat program berjalan). Error seperti ini disebut eksepsi. Misalnya, bila kita membuka file yang tidak ada, maka akan muncul pesan kesalahan FileNotFoundError
. Bila kita membagi bilangan dengan nol akan muncul ZeroDivisionError
, dan lain sebagainya.
Pada saat terjadi eksepsi, Python akan menampilkan traceback dan detail dimana kesalahan terjadi.
>>> 1/0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
Daftar Eksepsi Built-in Python
Tabel berikut menunjukkan semua eksepsi yang dimiliki Python
Eksepsi | Penyebab Error |
AssertionError | Muncul pada saat pernyataan assert gagal |
AttributeError | Muncul pada saat penugasan terhadap attribute atau referensi gagal |
EOFError | Muncul saat fungsi input() mendapatkan kondisi akhir file (end-of-file) |
FloatingPointError | Muncul saat operasi terhadap bilangan float gagal |
GeneratorExit | Muncul saat metode close() generator dipanggil |
ImportError | Muncul saat modul yang hendak diimpor tidak ditemukan |
IndexError | Muncul saat indeks dari sequence berada di luar range |
KeyError | Muncul saat suatu key tidak ditemukan di dalam dictionary |
KeyboardInterrupt | Muncul saat user menekan tombol interupsi (Ctrl + C) |
MemoryError | Muncul saat operasi kehabisan memori |
NameError | Muncul saat variabel tidak ditemukan |
NotImplementedError | Muncul oleh metode abstrak |
OSError | Muncul saat sistem operasi bersangkutan mengalami error |
OverflowError | Muncul saat hasil operasi perhitungan terlalu besar untuk direpresentasikan |
ReferenceError | Muncul saat weak reference digunakan untuk mengakses referensi sampah program |
RuntimeError | Muncul saat error yang terjadi di luar semua kategori eksepsi lain |
StopIteration | Muncul oleh fungsi next() untuk menunjukkan bahwa tidak ada lagi item yang tersisa pada iterator |
SyntaxError | Muncul oleh parser saat terjadi kesalahan sintaks |
IndentationError | Muncul saat ada indentasi yang salah |
TabError | Muncul saat indentasi memiliki jumlah spasi atau tab yang tidak konsisten |
SystemError | Muncul saat interpreter mendeteksi kesalahan internal |
SystemExit | Muncul oleh fungsi sys.exit() |
TypeError | Muncul saat melakukan operasi pada tipe data yang tidak sesuai |
UnboundLocalError | Muncul saat referensi dibuat untuk variabel lokal dari fungsi, tapi tidak ada nilainya. |
UnicodeError | Muncul saat terjadi kesalahan berkenaan dengan encoding dan decoding unicode |
UnicodeEncodeError | Muncul saat terjadi kesalahan pada proses encoding |
UnicodeDecodeError | Muncul saat terjadi kesalahan pada proses decoding |
UnicodeTranslateError | Muncul saat terjadi kesalahan berkenaan dengan penerjemahan unicode |
ValueError | Muncul saat fungsi menerima argumen yang tipe datanya salah |
ZeroDivisionError | Muncul saat terjadi operasi pembagian bilangan dengan nol |
Menangani Eksepsi Dengan Try, Except, dan Finally
Terjadinya eksepsi pada program dapat menyebabkan program terhenti. Untuk mencegah hal tersebut, kita harus mengantisipasi hal tersebut.
Python menyediakan metode penanganan eksepsi dengan menggunakan pernyataan try
dan except
.
Di dalam blok try
kita meletakkan baris program yang kemungkinan akan terjadi error. Bila terjadi error, maka penanganannya diserahkan kepada blok except
. Berikut adalah contoh penanganan eksepsi pada operasi pembagian bilangan.
# import modul sys untuk memperoleh jenis eksepsi
import sys
lists = ['a', 0, 4]
for each in lists:
try:
print("Masukan:", each)
r = 1/int(each)
break
except:
print("Upps!", sys.exc_info()[0], " terjadi.")
print("Masukan berikutnya.")
print()
print("Kebalikan dari ", each, " =", r)
Keluaran program di atas adalah seperti berikut ini:
Masukan: a Upps! <class 'ValueError'> terjadi Masukan berikutnya. Masukan: 0 Upps! <class 'ZeroDivisionError'> terjadi Masukan berikutnya. Masukan: 4 Kebalikan dari 4 = 0.25
Pada program di atas kita mencari kebalikan dari bilangan, misalnya 4, maka kebalikannya adalah 1/4 = 0.25.
Pembagian dengan huruf ‘a’, dan juga dengan 0 tidak bisa dilakukan, sehingga muncul error. Bila tidak dilakukan penanganan eksepsi, maka program akan langsung terhenti pada saat terjadi error.
Menangani Eksepsi Tertentu
Pada contoh di atas kita hanya menangani error secara umum. Tidak dikelompokkan, apakah dia adalah TypeError
, ValueError
, SyntaxError
, dan lain sebagainya.
Sebuah pernyataan try
, bisa memiliki sejumlah pernyataan except
untuk menangani jenis – jenis eksepsi secara lebih spesifik. Kita juga bisa mendefinisikan beberapa error sekaligus menggunakan tuple. Contohnya adalah seperti berikut:
try: # lakukan sesuatu pass except ValueError: # tangani eksepsi ValueError pass except (TypeError, ZeroDivisionError): # menangani multi eksepsi # TypeError dan ZeroDivisionError pass except: # menangani eksepsi lainnya pass
Pernyataan pass
adalah pernyataan yang tidak melakukan apa-apa. Istilahnya adalah statemen kosong. pass
sering digunakan untuk mengisi blok fungsi atau kelas yang masih kosong.
Memunculkan Eksepsi
Eksepsi muncul bila terjadi error pada saat runtime atau saat program berjalan. Akan tetapi, kita juga bisa memunculkan eksepsi dengan sengaja untuk maksud tertentu dengan menggunakan kata kunci raise
. Contohnya adalah seperti berikut:
>>> raise KeyboardInterrupt Treceback (most recent call last): ... KeyboardInterrupt >>> try: a = int(input("Masukkan sebuah bilangan positif: ")) if a <= 0: raise ValueError("Itu bukan bilangan positif!") except ValueError as ve: print(ve) Masukkan sebuah bilangan positif: -3 Itu bukan bilangan positif!
try…finally
Pernyataan try bisa memiliki pasangan pernyataan finally. Pernyataan di dalam blok finally akan tetap dieksekusi bagaimanapun kasusnya.
finally
biasa digunakan untuk melepaskan koneksi dengan resource eksternal. Seperti misalnya saat kita sedang mengedit suatu file di internet dan tiba – tiba internet terputus. Atau saat kita login ke pusat data dan koneksi terputus.
Pada kasus tersebut, kita harus membersihkan resource yang digunakan, terlepas ia sukses atau tidak. Aksi tersebut (menutup file, atau memutus koneksi ke jaringan) dilakukan dengan menggunakan pernyataan finally untuk menjamin suatu perintah tetap dieksekusi.
Berikut adalah contoh try…finally untuk mengoperasikan file.
try: f = open("C:\\test.txt") # melakukan operasi terhadap file finally: f.close()
finally
menjamin bahwa file akan tetap di tutup walaupun ada error pada saat operasi terhadap file.