Penanganan Eksepsi
Pada dikala menulis dan menjalankan program, kita sering dihadapkan pada munculnya kesalahan atau error. Seringkali error mengakibatkan acara berhenti sendiri.
Error mampu terjadi simpulan kesalahan struktur (sintaks) program. Hal ini disebut syntax error. Contohnya yaitu ibarat berikut:
>>> if x < 5
File "<stdin>", line 1
if x < 5
^
SyntaxError: invalid syntax
Kita mampu melihat bahwa penyebabnya yaitu lupa titik dua pada pernyataan if.
Error juga mampu terjadi pada dikala runtime (saat acara berjalan). Error ibarat ini disebut eksepsi. Misalnya, jikalau 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 dikala 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 memperlihatkan semua eksepsi yang dimiliki Python
Eksepsi | Penyebab Error |
AssertionError | Muncul pada dikala pernyataan assert gagal |
AttributeError | Muncul pada dikala penugasan terhadap attribute atau contoh gagal |
EOFError | Muncul dikala fungsi input() mendapat kondisi final file (end-of-file) |
FloatingPointError | Muncul dikala operasi terhadap bilangan float gagal |
GeneratorExit | Muncul dikala metode close() generator dipanggil |
ImportError | Muncul dikala modul yang hendak diimpor tidak ditemukan |
IndexError | Muncul dikala indeks dari sequence berada di luar range |
KeyError | Muncul dikala suatu key tidak ditemukan di dalam dictionary |
KeyboardInterrupt | Muncul dikala user menekan tombol interupsi (Ctrl + C) |
MemoryError | Muncul dikala operasi kehabisan memori |
NameError | Muncul dikala variabel tidak ditemukan |
NotImplementedError | Muncul oleh metode abstrak |
OSError | Muncul dikala sistem operasi bersangkutan mengalami error |
OverflowError | Muncul dikala hasil operasi perhitungan terlalu besar untuk direpresentasikan |
ReferenceError | Muncul dikala weak reference digunakan untuk mengakses contoh sampah program |
RuntimeError | Muncul dikala error yang terjadi di luar semua kategori eksepsi lain |
StopIteration | Muncul oleh fungsi next() untuk memperlihatkan bahwa tidak ada lagi item yang tersisa pada iterator |
SyntaxError | Muncul oleh parser dikala terjadi kesalahan sintaks |
IndentationError | Muncul dikala ada indentasi yang salah |
TabError | Muncul dikala indentasi memiliki jumlah spasi atau tab yang tidak konsisten |
SystemError | Muncul dikala interpreter mendeteksi kesalahan internal |
SystemExit | Muncul oleh fungsi sys.exit() |
TypeError | Muncul dikala melakukan operasi pada tipe data yang tidak sesuai |
UnboundLocalError | Muncul dikala contoh dibuat untuk variabel lokal dari fungsi, tapi tidak ada nilainya. |
UnicodeError | Muncul dikala terjadi kesalahan berkenaan dengan encoding dan decoding unicode |
UnicodeEncodeError | Muncul dikala terjadi kesalahan pada proses encoding |
UnicodeDecodeError | Muncul dikala terjadi kesalahan pada proses decoding |
UnicodeTranslateError | Muncul dikala terjadi kesalahan berkenaan dengan penerjemahan unicode |
ValueError | Muncul dikala fungsi mendapat argumen yang tipe datanya salah |
ZeroDivisionError | Muncul dikala terjadi operasi pembagian bilangan dengan nol |
Menangani Eksepsi Dengan Try, Except, dan Finally
Terjadinya eksepsi pada acara mampu mengakibatkan acara 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 acara yang kemungkinan akan terjadi error. Bila terjadi error, maka penanganannya diserahkan kepada blok except
. Berikut yaitu teladan 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 acara di atas yaitu ibarat 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 acara di atas kita mencari kebalikan dari bilangan, misalnya 4, maka kebalikannya yaitu 1/4 = 0.25.
Pembagian dengan huruf ‘a’, dan juga dengan 0 tidak mampu dilakukan, sehingga muncul error. Bila tidak dilakukan penanganan eksepsi, maka acara akan pribadi terhenti pada dikala terjadi error.
Menangani Eksepsi Tertentu
Pada teladan di atas kita hanya menangani error secara umum. Tidak dikelompokkan, apakah dia yaitu TypeError
, ValueError
, SyntaxError
, dan lain sebagainya.
Sebuah pernyataan try
, mampu memiliki sejumlah pernyataan except
untuk menangani jenis – jenis eksepsi secara lebih spesifik. Kita juga mampu mendefinisikan beberapa error sekaligus menggunakan tuple. Contohnya yaitu ibarat 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
yaitu pernyataan yang tidak melakukan apa-apa. Istilahnya yaitu statemen kosong. pass
sering digunakan untuk mengisi blok fungsi atau kelas yang masih kosong.
Memunculkan Eksepsi
Eksepsi muncul jikalau terjadi error pada dikala runtime atau dikala acara berjalan. Akan tetapi, kita juga mampu memunculkan eksepsi dengan sengaja untuk maksud tertentu dengan menggunakan kata kunci raise
. Contohnya yaitu ibarat 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 mampu 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 dikala kita sedang mengedit suatu file di internet dan tiba – tiba internet terputus. Atau dikala kita login ke pusat data dan koneksi terputus.
Pada problem 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 yaitu teladan 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 dikala operasi terhadap file.