Python Exception handling adalah suatu mekanisme penanganan flow normal program karena terjadi exception dengan melanjutkan flow ke code block lainnya.
Kenapa harus menangani exception? Karena terjadi exception dan kita tidak tangani, maka program akan berhenti.
Object exception mengandung informasi dimana dan kenapa exception terjadi. Jadi kita dapat melakukan tindakan tepat agar program tetap berjalan semestinya.
Contoh program pendek untuk exception handling, nama program pada contoh adalah exceptional.py
def convert(s): '''convert to integer''' x = int(s) return xMasuk ke REPL, import modul yang baru kita buat diatas. Lalu coba jalankan fungsi convert() dengan mengisi angka berupa string. Fungsi berjalan dengan baik.
Lalu coba juga jalankan fungsi dengan mengisi string character. Akan terjadi error.
ValueError yang adalah type exception yang harus ditangani, dan dan kalimat “invalid literal for int()..’ adalah error messagenya.
>>> from exceptional import convert >>> convert("12") 12 >>> convert("qqq") Traceback (most recent call last): File "", line 1, in File "D:\learning\python\megacourse\exceptional.py", line 5, in convert x = int(s) ValueError: invalid literal for int() with base 10: 'qqq'Berikut modifikasi program dengan menambahkan try except block, untuk menangani exception. Perintah print bertujuan agar mudah melihat jalannya program.
Save program tersebut, kembali ke REPL dan import modul tersebut, dan lalukan test yang sama. Kali ini program tidak berhenti, karena kita sudah menangani exception dalam block try except
def convert(s): '''convert to integer''' try: x = int(s) print("Konversi berhasil!, x=", x) except ValueError: print("Konversi gagal!") x = -1 return x>>> from exceptional import convert >>> convert("12") Konversi berhasil!, x= 12 12 >>> convert("qqq") Konversi gagal! -1Menggunakan except ValueError as
Coba bereksperimen dengan passing list pada fungsi konversi, akan terjadi error, perlu ditambahkan exception handling untuk error tersebut.
Caa agar program menampilkan error secara detail, gunakan as clause untuk mendapatkan referensi ke object error tersebut. Syntaxnya adalah except ValueError as e:
as clause mengakses objek error dan mengambil error message yang lebih detail. Untuk mengakses standar error, sys library harus diimport pada program.
Berikut contoh program yang sudah dimodifikasi agar error message lebih informatif.
import sys def convert(s): '''convert to integer''' try: return int(s) except (ValueError, TypeError) as e: print("Konversi error : {}".format(str(e)), file=sys.stderr) return -1>>> from exceptional import convert >>> convert([1, 2, 3]) Konversi error : int() argument must be a string, a bytes-like object or a number, not 'list' -1Pada block except contoh program diatas melakukan print dan return -1. Hanya untuk kebutuhan demo program saja agar lebih simple.
Pada program production, lebih baik menggunakan perintah raise.
Python akan melakukan re-raises exception yang sedang dihandle dan menampilkan ke layar. Perintah print dapat diganti menjadi error logging ke system file. Untuk error logging tidak dibahas disini, diperlukan sesi tutorial khusus, karena cukup kompleks.
Finally Block
Finally block ini akan dijalankan apapun hasil dari try except block. Sebagai contoh, program sederhana dari screen capture berikut. Program ini akan masuk ke satu direktori, membuat direktori kemudian kembali ke direktori original.
Misalkan karena sesuatu hal, proses membuat direktori gagal (perintah os.mkdir), maka perintah selanjutnya os.chdir(original_path) tidak akan di eksekusi.
Agar os.chdir (original_path) selalu dijalankan, dapat dibuat seperti berikut dengan menggunakan try-finally block.
Atau bila ingin menggunakan exception untuk handling error, dapat digunakan try-except-finally block
Salah tips menggunakan Blok finally biasanya saat hendak cleanup resource, misalnya closing pointer ke file, atau closed connection ke database, etc.
Tips ini tidak mutlak, kembali ke tujuan masing-masing program.