Membuat class context manager cukup rumit, untuk mempermudah dapat digunakan library contextlib. contextlib adalah standard library Python yang menyediakan utility untuk fungsi umum yang berhubungan dengan with-statement.
Berikut garis besar penggunaan dari contextlib.contextmanager
@contextlib.contextmanager
def my_con_man():
#enter
try:
yield [value]
#normal exit
except:
#exception exit
raise
with my_con_man() as x:
#code goes here
Mari kita ubah class context manager sebelumnya dengan menggunakan library contextlib.
import contextlib
import sys
@contextlib.contextmanager
def logging_con_man():
print("Logging_Con_man: enter()")
try:
yield "In the block"
print ("Logging_Con_man: normal exit")
except Exception:
print('Logging_con_man: exception exit', sys.exc_info())
>>> from conmanlib import *
>>> with logging_con_man() as x:
... print(x)
...
Logging_Con_man: enter()
In the block
Logging_Con_man: normal exit
>>> with logging_con_man() as x:
... raise ValueError()
...
Logging_Con_man: enter()
Logging_con_man: exception exit (<class 'ValueError'>, ValueError(), <traceback object at 0x01DD4048>)
>>>
Pada contoh diatas, saat terjadi exception, exception tidak di propagasi. Untuk melakukan propagasi, cukup tambahkan perintah raise.
import contextlib
import sys
@contextlib.contextmanager
def logging_con_man():
print("Logging_Con_man: enter()")
try:
yield "In the block"
print ("Logging_Con_man: normal exit")
except Exception:
print('Logging_con_man: exception exit', sys.exc_info())
raise
>>> with logging_con_man() as x: .")
... raise ValueError()
...
Logging_Con_man: enter()
Logging_con_man: exception exit (<class 'ValueError'>, ValueError(), <traceback object at 0x01067128>)
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ValueError
Exception dari context manager di propagasi, terlihat dengan adanya object Traceback pada log diatas.
Summary
- contextlib mempermudah programmer untuk menggunakan context manager.
- semua code sebelum perintah yield adalah bagian dari __enter__()
- semua code setelah perintah yield adalah bagian dari __exit__()
- exception ditangani dengan normal exception tool.
Dengan bearkhirnya modul ini, Course Pengenalan Python Error Handling sudah selesai. Semoga bermanfaat.