Exception Handling pada Python



Exception handling adalah suatu mekanisme penanganan flow normal program karena terjadi exception  dengan melanjutkan flow ke code block lainnya.

Bila terjadi exception dan kita tidak tangani, maka program akan berhenti, jadi kita harus menangani exception dalam program kita.

Object exception mengandung informasi dimana dan kenapa exception terjadi. Jadi kita dapat melakukan tindakan tepat agar program tetap berjalan semestinya.

Untuk contoh, kita buat program kecil, simpan, lalu import program tersebut di REPL. Untuk contoh ini saya gunakan nama exceptional.py


''' demo exception '''

def convert(s):
    '''convert to integer'''
    x = int(s)
    return x

Kemudian jalankan REPL, import modul yang baru kita buat diatas. Lalu coba jalankan fungsi convert() dengan mengisi string angka. Fungsi berjalan dengan baik.

>>> 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'

Lalu coba dengan string teks. Pada string teks akan terjadi error. Karena program berusaha melakukan konversi non number argumen pada perintah int(x).

ValueError yang tampil diatas adalah type exception yang harus kita handle, dan dan kalimat "invalid literal for int()..' adalah error messagenya.

Mari kita perbaiki programnya dengan menambahkan try except block, untuk menangani exception. Kita tambahkan perintah print hanya untuk lebih mudah melihat jalannya program saja. Setelah disimpan, kembali ke REPL dan import modul kita, dan lalukan test yang sama. Kali ini program tidak berhenti, karena kita sudah menangani exception dalam block try except.

''' demo exception '''

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!
-1

Silakan bereksperimen dengan mencoba konversi list, akan terjadi error, coba tambahkan exception handling untuk error tersebut.

Bila program ingin menampilkan error secara detail, gunakan as clause untuk mendapatkan referensi ke object error tersebut.

except ValueError as e:

Dengan cara diatas kita bisa mengakses objek error dan mengambil error message yang lebih detail. Untuk mengakses standar error, kita harus import sys library pada program kita.

Berikut contoh program yang sudah kita modifikasi agar lebih informatif.

''' demo exception '''

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'
-1

Pada contoh diatas kita memberikan melakukan print ke layar dan memberikan return -1 pada block except hanya untuk kebutuhan demo program saja untuk lebih simple, disarankan lebih baik menggunakan perintah raise saja, ini akan re-raises exception yang sedang dihandle dan menampilkan ke layar. Perintah print dapat diganti menjadi error logging ke system file

''' demo exception '''

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)
        raise


Finally Block

Finally block ini akan dijalankan apapun hasil dari try except. 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


Blok finally pada proyke yang saya pernah kerjaka biasanya digunakan saat hendak cleanup resource, misalnya closing pointer ke file, atau closed connection ke database, etc. (tidak mesti seperti itu, tergantung kebutuhan program juga)
Exception Handling pada Python Exception Handling pada Python Reviewed by noname needed on June 02, 2018 Rating: 5

No comments:

Powered by Blogger.