Debugging in python

2017 views Oct 30, 2024

ကျွန်တော်တို့ဒီနေ့တော့ python programတစ်ပုဒ်မှာ error တွေ ဘယ်လို debug လုပ်သင့်တယ်ဆိုတဲ့ နည်းလေးတွေကိုပြပေးသွားပါမယ်။ကျွန်တော်တို့ အမြဲ codeတွေရေးကြတယ် ERROR ကြည့်ချင်ရင် print() နဲ့ထုတ်ကြည့်ကြတာများတယ်  စလေ့လာတဲ့အခါမှာ။တကယ်တော့ မကောင်းတဲ့ အကျင့်ထဲမှာ ပါတယ်လို့လဲ ပြောလို့မရပါဘူး။ဒါပေမဲ့ ဒီလိုလေးတွေ လုပ်မယ်ဆို ပိုကောင်းတယ်လို့ ပြောချင်တာပါ။

အဲ့တော့ ကျွန်တော်တို့စလိုက်ရအောင်

Logging

ကျွန်တော်တို့ logging ကတော့ မျိုးစုံသုံးလို့ရပါတယ်။ဒီမှာတော့ Error ပြချင်တဲ့အခါ ဘယ်လိုသုံးမလဲဆိုတာကို လေ့လာရအောင်။


import logging 

logging.debug('This is a debug message') 
logging.info('This is an info message') 
logging.warning('This is a warning message') 
logging.error('This is an error message') 
logging.critical('This is a critical message')

ကျွန်တော်တို့ logging မှာတော့ message အမျိုုးမျိုးထုတ်လို့ရတယ်ဆိုတာ အပေါ်က example ကိုကြည့်ရင်တွေ့မှာပါ။အဲ့တော့ ကျွန်တော်တို့ error message တွေကို တော့ logging.error ကိုသုံးပြီးပြပါတယ်။

ကျွန်တော်တို့ logging ရဲ့အားသာချက်က configuration လုပ်လို့ရပြီး error message တွေကိုပေါ်စေချင်သလိုဖြစ်စေ file ထဲကို ရေးထည့်တာမျိုးကို အလွယ်လုပ်လို့ရတာပါပဲ။logging ရဲံ config syntax ကိုကြည့်မယ်ဆိုအောက်ကတိုင်းပါပဲ။

import logging
 
logging.basicConfig(level=logging.DEBUG,format='Error is-%(message)s')
logging.debug("I am Error")

logging.basicConfig() ထဲမှာ ကျွန်တော်တို့ configuration ချချင်တာတွေကိုထည့်ပေးကျပါတယ်။ဒီနေရာမှာတော့ levelနဲ့format ကတော့ ပေါ်ချင်တဲ့ပုံစံပါ။အပေါ်က exampleကိုrunလိုက်မယ်ဆို

$ python debugging.py 
Error is-I am Error

format ချထားတာကြောင့် အဲ့လိုပုံစံလေးပေါ်လာပါတယ်။ဒါဆိုကျွန်တော်ပြောထားတဲ့ fileထဲကိုရေးထည့်မယ်ဆိုတဲ့ကိစလာပါပြီ။

import logging
 
logging.basicConfig(filename='errorlog.txt',level=logging.DEBUG,
	format='%(asctime)s-%(levelname)s-Error is-%(message)s')
logging.debug("I am Error")

ကျွန်တေ်ာတို့ filename လေး သတ်မှတ်ပေးလိုက်ယုံပါပဲ။ဒါလေးပါပဲ။ကျွန်တေ်ာတို့ output file ကိုကြည့်လိုက်မယ်ဆိုရင်တော့။

$ python debugging.py
$ cat errorlog.txt 
2018-09-14 21:14:31,063-DEBUG-Error is-I am Error
ကျွန်တော်တို့ exception handler တွေနဲ့ရေးမယ်ဆိုလဲ
import logging
 
filename = "notexists.txt"
 
try:
	with open(filename,'r') as f:
		print(f.read())
 
except Exception as e:
	logging.error("Error Occur",exc_info=True)

ကျွန်တေ်ာတို့မရှိတဲ့ filename ကိုရေးထည့်ပြီး ဖတ်ကြည့်ပါတယ်။သေချာError တတ်မှာပါ။ဘယ်လိုသုံးလို့ရတယ်ဆိုတာလေးပြချင်လို့ပါ။

$ python debugging.py 
ERROR:root:Error Occur
Traceback (most recent call last):
  File "debugging.py", line 6, in <module>
    with open(filename,'r') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'notexists.txt'

ကျွန်တော်တို့ run လိုက်တော့ အပေါ်ကတိုင်းတွေ့ရမှာပါ။ဆက်ပြီးတခြားပုံစံတွေလေ့လာရအောင်။

Raise KeyWord

raise keyword သုံးတာကတော့ ရိုးရှင်းပါတယ်။ရေးပုံကတော့

raise Exception('Error!')

ဒါမျိုးပုံစံလေးပါပဲ။Example အနေနဲ့တော့

filename = "notexists.txt"
 
try:
	with open(filename,'r') as f:
		print(f.read())
 
except Exception as e:
	raise

ကျွန်တော်တို့ အောက်ဆုံးက raise လို့ရေးပေးလိုက်တာနဲ့ အပေါ်က exception ကိုထုတ်ပြပါတယ်။outputကတော့

$ python debugging.py 
Traceback (most recent call last):
  File "debugging.py", line 4, in <module>
    with open(filename,'r') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'notexists.txt'

 handler မသုံးဘူးဆိုလဲ ရိုးရိုးလေးရေးယုံပါပဲ။

i = 4
if i > 3:
	raise Exception("Input Error!")
 
$ python debugging.py
Traceback (most recent call last):
  File "debugging.py", line 4, in <module>
    raise Exception("Input Error!")
Exception: Input Error!

Assert

ကျွန်တော်တို့ assert ကိုတော့ true false ပုံစံမျိုးနဲ့ စစ်ပြီးသုံးကြပါတယ်။ဥပမာ မိတ်ဆွေရဲ့ programတစ်ခုမှာ စားတဲ့ function ရှိတယ်ဆိုပါတော့စားတဲ့ကောင် ပိုင်းခြေက zeroဖြစ်လို့မရတာမျိုး အဲ့အခါကျ zero ဖြစ်နေရင် error ထုတ်ပြပြီး zeroမဖြစ်မှဆက်လုပ်စေတဲ့ပုံစံမျိုးတွေမှာသုံးပါတယ်။

assert ကတော့ အောက်ပါတိုင်းရေးပါတယ်

assert <condition>,<error message>

assert က conditionပဲရေးလို့ရပေမယ့် error messageကိုထည့်စေချင်လို့ ပြလိုက်တာပါ။ကျွန်တော်တို့ ၆ဘာသာပေါင်းပေးတဲ့ function လေးရေးကြည့်ရအောင်

def sum_marks(marks):
	assert len(marks) == 6,"length must be 6"
	return sum(marks)
 
 
print(sum_marks([40,40,80,80]))

အဲ့တော့ len(marks) == 6 ဆိုတဲ့ condition သာမပြေလည်ဘူးဆို နောက်က Error message ကိုထုတ်ပြမှာပါ။ဒီမှာ ကျွန်တော်တို့ list မှာ ၄ဘာသာ ပဲထည့်ထားတာတွေ့မှာပါ။အဲ့တော့ Error ကတတ်မှာပါပဲ။

len(marks) == 6

$ python debugging.py 
Traceback (most recent call last):
  File "debugging.py", line 6, in <module>
    print(sum_marks([40,40,80,80]))
  File "debugging.py", line 2, in sum_marks
    assert len(marks) == 6,"length must be 6"
AssertionError: length must be 6

အကယ်လို့ ၆ဘာသာလုံးထည်ေ့ပးလိုက်မယ်ဆိုရင်တော့ ဆက်ပြီးအလုပ်လုပ်စေပါတယ်။

def sum_marks(marks):
	assert len(marks) == 6,"length must be 6"
	return sum(marks)
 
 
print(sum_marks([40,40,80,80,50,50]))

Output

$ python debugging.py 
340

ကျွန်တော် အားလုံးကိုနားလည်မယ်လို့ ယုံကြည်ပါတယ်။ကျေးဇူးတင်ပါတယ်။