প্রোগ্রাম করতে গেলে এরর (Error) বা ভূল হবে এটা খুবই স্বাভাবিক একটা ঘটনা, কিন্তু এটাকে ঠিক করা একটি জটিল কাজ। একজন ভাল প্রোগ্রামারের লক্ষণ হচ্ছে যেকোন এরর কে খুব সহজেই সনাক্ত বা ডিবাগ (Debug) করতে পারা।
এরর কে মোটামুটি তিনটি ভাগে ভাগ করা যায়-
- কম্পাইল টাইম এরর/ সিনট্যাক্স এরর (Compile time error/syntax error)
- রানটাইম এরর (Run time error)
- লজিক্যাল এরর (Logical Error)
কম্পাইল টাইম / সিনট্যাক্স এরর (Compile time error/syntax error)
যত ধরণের এরর আছে তার ভিতর কম্পাইলার এরর বা সিনট্যাক্স এরর হ্যন্ডল করা সবচেয়ে সহজ; কারণ কম্পাইল টাইমেই এগুলো ধরা যায় এবং অধিকাংশ ক্ষেত্রে কম্পাইলারই নির্দেশ করে যে কোথায় ভূল আছে। যেমন আমরা যদি কখনো কোন ফাংশন বা ক্লাসের ডেফিনিশন লেখার সময় কোলন দিতে ভুলে যাই সেটা একটি কম্পাইল টাইম এরর। যেমন-
#This program is an example of compiler/syntax error in Python
print("This is an error"
ফলাফল-
print("This is an error"
^
SyntaxError: '(' was never closed
এখানে একটি এরর দেখাচ্ছে এবং এটি একটি SyntaxError.
রানটাইম এরর (Run time error)
কোন প্রোগ্রাম রান হবার পরে কোন ইনপুট বা ফলাফলের উপর ভিত্তি করে রানটাইম এরর হয়। এই ধরনের এরর খুজে বের করা সিনট্যাক্স এররের থেকে একটু ঝামেলার। একটা উদাহরনের সাহায্যে দেখে নেই-
#This program is an example of run time error in Python
a=15
b=5
c=0
print(a/b)
print(a/c) # Divide by zero error
ফলাফল-
3.0
Traceback (most recent call last):
File "main.py", line 8, in <module>
print(a/c)
ZeroDivisionError: division by zero
এখানে ফলাফল 3.0 এসেছে ৭ম লাইনের জন্য; কিন্তু পরক্ষণেই একটি এরর এসেছে ৮ম লাইনে। কারণ এখানে divide by zero সমস্যা আছে। অর্থাৎ প্রোগ্রামটি সঠিকভাবে রান হয়েছে কিন্তু ভ্যালুর কারনের একটা এরর এসেছে।
লজিক্যাল এরর (Logical Error)
যেকোন ধরনের মানবসৃষ্ট ভুল যেটা মূলত প্রোগ্রামারের কারণে হয়েছে সেটাই লজিক্যাল এরর। ধরা যাক আমরা একটি লুপের সাহায্যে ১ থেকে ১০ পর্যন্ত সংখ্যা আউটপুটে দেখাবো –
i=1
while(i<10):
print(i)
i+=1
ফলাফল –
1
2
3
4
5
6
7
8
9
এখানে ফলাফল এসেছে ১ থেকে ৯ পর্যন্ত, ১০ পর্যন্ত নয়; কারণ এখানে একটি লজিক্যাল এরর আছে। while এর কন্ডিশনে < কন্ডিশন ব্যবহার করাতে এই ভূলটা হয়েছে। এটা দুই ভাবে সমাধান করা যায়; প্রথমত, <= ব্যবহার করে অথবা কন্ডিশনে ১০ ব্যবহার না করে ১১ ব্যবহার করে। নিচে এই দুটি দেখে নেই –
i=1
while(i<=10):
print(i)
i+=1
অথবা
i=1
while(i<11):
print(i)
i+=1
এক্সেপশন হ্যান্ডেলিং (Exception Handling)
এতক্ষণে আমরা এররগুলো দেখছিলাম, এখন আমরা এই এররগুলো কিভাবে নিয়ন্ত্রণ করা যায় সেগুলো দেখে নেব। রানটাইম এররের সময় দেখেছি যে কোন এরর ধরা পড়লে পুরো প্রোগ্রামটাই বন্ধ হয়ে যাচ্ছে; কিন্তু প্রকৃতপক্ষে শুধু ঐ অংশটুকুই বাদ দেওয়ার কথা ছিল। এগুলোর জন্য পাইথনে নির্দিষ্ট কিছু পন্থা আছে –
try এবং except
try স্টেটমেন্ট কোন একটি কোড ব্লকে এরর হলে সেটা হ্যান্ডেল করে এবং সেটা except ব্লকে পাঠিয়ে দেয়। উপরে আমরা যে উদাহরণটি দেখেছিলাম সেটা আবার try ব্লকে দেখি –
#This program is an example of try except block in Python
a=15
b=5
c=0
try:
print(a/b)
print(a/c) # Divide by zero error
except Exception as e:
print("This is an Exception",e)
ফলাফল-
3.0
This is an Exception division by zero
এখানে try ব্লকে একটা এরর পেয়েছে এবং সেখান থেকে সেটা except ব্লকে পাঠিয়ে দিয়েছে। পূর্বে আমরা দেখেছি যে সম্পূর্ণ প্রোগ্রামটাই বন্ধ হয়ে গেছে; কিন্তু এবার যতটুকু সম্ভব কাজ করেছে এবং তারপর আমাদের ডিফাইন করা মেসেজ দেখিয়েছে। এক্ষেত্রে কোন ধরনের বড় সমস্যা ছাড়াই প্রোগ্রামটি স্বাভাবিকভাবে কাজ করতে সক্ষম হয়েছে।
Finally
try এবং exception ছাড়াও finally আর একটি স্টেমেন্ট যেটা কোন এরর থাকুক বা না থাকুক এক্সিকিউট হয়। উপরের উদাহরনটি দেখি –
a=15
b=5
c=0
try:
print(a/b)
print(a/c) # Divide by zero error
except Exception as e:
print("This is an Exception",e)
finally:
print("This is from the final block")
ফলাফল-
3.0
This is an Exception division by zero
This is from the final block
এখানে দেখতে পাচ্ছি যে except ব্লকের exception টা দেখানোর পরেও finally ব্লকের মেসেজ দেখিয়েছে। এখন কোন এরর ছাড়া আর একটি উদাহরন দেখে আসি –
a=15
b=5
try:
print(a/b)
except Exception as e:
print("This is an Exception",e)
finally:
print("This is from the final block")
ফলাফল-
3.0
This is from the final block
অর্থাৎ কোন এরর থাকুক বা না থাকুক finally ব্লকটা execute হবেই।