এক্সসেপশন (Exceptions) পাইথন ইন্টারপ্রেটার (interpreter) দ্বারা এবং ম্যানুয়ালি উত্থাপিত (raised) হতে পারে। বিল্ট-ইন এক্সসেপশনগুলো একটি প্রোগ্রামে সাধারণ এররগুলো ক্যাচ (catch) করতে সাহায্য করে।
এই গাইডে, আমরা আলোচনা করব এক্সসেপশন কী এবং এগুলো কীভাবে ব্যবহার করা হয়। আমরা একটি উদাহরণের মাধ্যমে যাব কীভাবে একটি এক্সসেপশন উত্থাপন (raise) করতে হয় যাতে আপনি আপনার কোডে এগুলোতে কাজ করতে পারেন।
এক্সসেপশন (Exception) কী?
একটি এক্সসেপশন, যাকে লজিক্যাল এরর (logical error) ও বলা হয়, হলো একটি এরর যা প্রোগ্রাম রানটাইম (runtime) এর সময় ঘটে।
পাইথনে দুই ধরনের এরর থাকে: সিনট্যাক্স এরর (syntax errors) এবং রানটাইম এরর (runtime errors)। সিনট্যাক্স এররগুলো প্রোগ্রাম রান হওয়ার আগে উত্থাপিত হয়। আপনার প্রোগ্রাম যদি একটি সিনট্যাক্স এরর সম্মুখীন হয়, তবে আপনার প্রোগ্রাম রান করতে পারবে না। এর কারণ হল পাইথন সিনট্যাক্স এরর ধারণকারী কোড ইন্টারপ্রেট (interpret) করতে পারে না।
রানটাইম এরর, যাকে এক্সসেপশন ও বলা হয়, পাইথন একটি প্রোগ্রাম রান করার সময় সম্মুখীন হয়। একটি এক্সসেপশন প্রোগ্রামের লাইন ৩০-এ উত্থাপিত হতে পারে। যদি লাইন ৩০-এ একটি এক্সসেপশন উত্থাপিত হয়, তবে ৩০ লাইন কোড রান হবে, তারপর প্রোগ্রাম থেমে যাবে।
এখানে একটি এক্সসেপশনের উদাহরণ:
Traceback (most recent call last): File "main.py", line 6, ins_names.append(n) AttributeError: 'str' object has no attribute 'append'
এই এক্সসেপশনটি আমাদের বলে পাইথন আমাদের কোডের বাকি অংশ রান করতে পারে না। আপনি যদি একটি এক্সসেপশন সম্মুখীন হন, তবে আপনাকে উচিত বার্তাটি সাবধানে পড়ুন। এরর মেসেজটি আপনাকে بیشترাংশ, যদি সব না হয়, যা আপনাকে একটি এরর সমাধান করতে জানতে হয় সেটি বলবে।
আমাদের এরর মেসেজের শেষ বাক্যটি ভাঙিয়ে দেখা যাক:
AttributeError: 'str' object has no attribute 'append'
এই কেসে, আমরা জানি আমাদের এররটি একটি AttributeError। এর মানে আমরা একটি এমন এট্রিবিউট (attribute) রেফারেন্স করার চেষ্টা করছি যা অস্তিত্বে নেই। আমাদের এরর মেসেজটি আমাদের বলে আমরা একটি স্ট্রিং অবজেক্টে append() ব্যবহার করার চেষ্টা করছি, যেটি অনুমোদিত নয়।
কারণ স্ট্রিং অবজেক্টগুলো append() মেথড সাপোর্ট করে না, একটি ভালো পরবর্তী ধাপ হচ্ছে স্ট্রিং-এর জন্য append() এর সমতুল্য খুঁজে বের করা। এটি কনক্যাটেনেশন (concatenation)। এখন আমাদের প্রোগ্রামিং সমস্যার একটি সম্ভাব্য সমাধান আছে যা আমরা প্রয়োগ করতে পারি।
আমি কোথায় এক্সসেপশন সম্মুখীন হতে পারি?
প্রোগ্রামারদের তাদের কোডে এরর ক্যাচ করতে সাহায্য করার জন্য, পাইথনে বিল্ট-ইন এক্সসেপশনların একটি রেঞ্জ (range) আছে। এই এক্সসেপশনগুলো আপনাকে আপনার কোডে একটি সমস্যার কারণ চিহ্নিত করতে সাহায্য করতে পারে যাতে আপনি সেগুলো ঠিক করতে পারেন। নিচে কিছু সবচেয়ে সাধারণ এক্সসেপশন দেওয়া হলো যেগুলো আপনি সম্ভবত সম্মুখীন হবেন:
- TypeError: ঘটে যখন আপনি একটি ফাংশন একটি অবজেক্টে প্রয়োগ করেন যার টাইপ সেই ফাংশনকে সাপোর্ট করে না। (যেমন: TypeError: can only join an iterable)
- SyntaxError: প্রোগ্রাম এক্সিকিউট হওয়ার আগে উত্থাপিত হয় আপনাকে জানাতে যে আপনার সিনট্যাক্সে একটি সমস্যা আছে (যেমন: SyntaxError: invalid syntax)
- KeyError: ঘটে যদি আপনি একটি ডিকশনারিতে একটি কী রেফারেন্স করেন যা অস্তিত্বে নেই। (যেমন: KeyError: "usb_ports")
- ImportError: ঘটে যদি আপনি একটি প্যাকেজ ইম্পোর্ট (import) করার চেষ্টা করেন যা অস্তিত্বে নেই, বা একটি প্যাকেজ থেকে একটি ফাংশন যা অস্তিত্বে নেই।
আমরা শুধু আপনি পাইথন ল্যাঙ্গুয়েজে সম্মুখীন হতে পারেন এমন অনেক এক্সসেপশনের কিছুটি লিস্ট করেছি।
এক্সসেপশন কীভাবে উত্থাপন (Raise) করবেন
আপনি আপনার কোডে আপনার নিজস্ব কাস্টম এক্সসেপশন সংজ্ঞায়িত করতে পারেন। এটি সাহায্যকর হতে পারে যদি পাইথন দ্বারা প্রদত্ত বিল্ট-ইন এক্সসেপশনগুলো আপনার প্রোগ্রামের প্রয়োজনীয়তা পূরণ না করে।
আমরা একটি প্রোগ্রাম লিখব একটি গেমের পাসওয়ার্ড যাচাই (validate) করতে। শুরুতে, ব্যবহারকারীকে একটি পাসওয়ার্ড ইনপুট দিতে বলুন:
password = input("Enter a password: ")
ব্যবহারকারীর পাসওয়ার্ড বৈধ হতে হলে, সেটি ১২ ক্যারেক্টারটির বেশি দীর্ঘ হতে হবে। যদি ব্যবহারকারীর পাসওয়ার্ড ১২ ক্যারেক্টার বা তার কম হয়, তবে আমরা একটি এক্সসেপশন উত্থাপন করতে চাই।
এটি করার জন্য, আমরা একটি if স্টেটমেন্ট ব্যবহার করব। নিচের if স্টেটমেন্টটি চেক করবে যে ব্যবহারকারীর নির্বাচিত পাসওয়ার্ড ১২ ক্যারেক্টার থেকে কম কিনা:
if len(password) > 12:
print("Your password is valid.")
else:
raise Exception("Your password is not the correct length.")
আমরা len() মেথড ব্যবহার করি ব্যবহারকারীর পাসওয়ার্ডের দৈর্ঘ্য গণনা করতে। যদি ব্যবহারকারী একটি অবৈধ পাসওয়ার্ড ইনপুট দেয়, তবে আমাদের প্রোগ্রাম একটি এক্সসেপশন উত্থাপন করবে একটি মেসেজ দিয়ে যা বলে "Your password is not the correct length."।
আমাদের কোডটি চেষ্টা করুন দেখতে এটি কাজ করে কিনা:
Enter a password: Bacon120 Traceback (most recent call last): File "main.py", line 6, inraise Exception("Your password is not the correct length.") Exception: Your password is not the correct length.
আমরা যে পাসওয়ার্ডটি দিয়েছিলাম সেটি ১২ ক্যারেক্টারের নিচে ছিল। আমাদের কোড থেমে গেছে কারণ আমরা একটি অবৈধ পাসওয়ার্ড ইনপুট দিয়েছিলাম। আমাদের প্রোগ্রামটি একটি বৈধ পাসওয়ার্ড দিয়ে রান করার চেষ্টা করুন:
Enter a password: Bacon120Bacon120 Your password is valid.
আমাদের প্রোগ্রাম সফলভাবে এক্সিকিউট হয়েছে।
এক্সসেপশন কীভাবে হ্যান্ডল (Handle) করবেন
ডিফল্টভাবে, এক্সসেপশনগুলো একটি প্রোগ্রামের এক্সিকিউশন (execution) বন্ধ করে দেয়। যদিও এটি উপকারী কারণ এটি আপনাকে একটি এরর সমাধান খুঁজে বের করতে বাধ্য করে, কিছু কেস আছে যেখানে আপনি চাইতে পারেন আপনার প্রোগ্রাম এক্সিকিউশন বন্ধ না করুক যদি একটি এক্সসেপশন উত্থাপিত হয়।
উদাহরণস্বরূপ, যদি আপনি চেক করেন একটি লিস্টে ডেটা পয়েন্টগুলো বৈধ কিনা, তবে আপনি চাইতে পারেন না প্রতিবার একটি অবৈধ ডেটা পয়েন্ট আবিষ্কৃত হলে একটি এক্সসেপশন উত্থাপিত হোক।
একটি এক্সসেপশন হ্যান্ডল করতে, আপনি একটি "try...except" ব্লক ব্যবহার করতে পারেন। চলুন একটি প্রোগ্রাম লিখি যা একটি ডিকশনারিতে একটি আইটেম খুঁজে বের করে। এই ডিকশনারিতে একটি ক্লাসের ছাত্রদের নাম এবং তাদের সাম্প্রতিক টেস্টের সংশ্লিষ্ট গ্রেডের একটি লিস্ট আছে।
শুরুতে, ছাত্র এবং গ্রেড তথ্য সহ একটি ডিকশনারি সংজ্ঞায়িত করুন:
data = {
"Lucy": 73,
"Carlton": 59,
"Adam": 73
}
এরপর, ব্যবহারকারীকে একজন ছাত্রের নাম ইনপুট দিতে বলুন যাদের গ্রেড তারা বের করতে চায়। আমরা এটি একটি "try" ব্লকের ভিতরে করব যাতে আমরা পরে কোডে এক্সসেপশন হ্যান্ডল করতে পারি:
try:
student = input("Enter the name of the student whose grade you want to retrieve: ")
print(data[student])
এই কোডটি সেই ছাত্রের গ্রেড প্রিন্ট করবে যার নাম ব্যবহারকারীর প্রোগ্রামে ইনপুট দেওয়া নামটির সাথে মিলে যাবে। তবে, যদি ব্যবহারকারী একটি অবৈধ নাম ইনপুট দেয়, তবে একটি KeyError সম্মুখীন হবে।
আমরা এটি হ্যান্ডল করব আমাদের কোডে একটি except ব্লক যোগ করে:
try:
student = input("Enter the name of the student whose grade you want to retrieve: ")
print(data[student])
except:
print("This student is not present in the list of grades.")
যদি একজন ছাত্র খুঁজে পাওয়া না যায়, তবে except ক্লজ (clause) এক্সিকিউট হবে। আমাদের প্রোগ্রামটি রান করুন:
Enter the name of the student whose grade you want to retrieve: Lucy 73
যখন আমরা একটি বৈধ ছাত্রের নাম ইনপুট দিই, আমাদের প্রোগ্রাম কাজ করে। আমাদের প্রোগ্রামটি চেষ্টা করুন যদি আমরা একটি অবৈধ ছাত্রের নাম ইনপুট দিই:
Enter the name of the student whose grade you want to retrieve: Kaitlin This student is not present in the list of grades.
একটি এক্সসেপশন উত্থাপিত হয়েছে কিন্তু আমাদের প্রোগ্রাম থেমে নেই। বদলে, "except" ব্লকের কন্টেন্টগুলো এক্সিকিউট হয়েছে।
try...except ব্লক সম্পর্কে আরও জানতে, আমাদের পাইথন try...except গাইড পড়ুন।
উপসংহার
এক্সসেপশনগুলো আপনাকে জানায় আপনার কোডে একটি লজিক্যাল এরর আছে। যখন একটি এক্সসেপশন উত্থাপিত হয়, তবে আপনাকে এক্সসেপশনের টাইপ, এক্সসেপশন কোথায় উত্থাপিত হয়েছে, সেই সাথে একটি এরর মেসেজ দেখতে পাবেন। আপনি এই তথ্যটি ব্যবহার করে এক্সসেপশনের কারণ খুঁজে বের করতে পারেন।
আপনি raise স্টেটমেন্ট ব্যবহার করে আপনার নিজস্ব এক্সসেপশন উত্থাপন করতে পারেন। আপনি try...except কোড ব্লক ব্যবহার করে এক্সসেপশন হ্যান্ডল করতে পারেন।
এখন আপনার কাছে একটি পাইথন এক্সসেপশন সমাধান করার টুলস আছে 마치 একটি প্রো-র মতো!