Handing
এই অংশে আপনি - ফাইল ও এক্সসেপশন হ্যান্ডেলিং শিখবেন। এদুটোই পাইথনের খুব গুরুত্বপূর্ণ কন্সেপ্ট। আমরা শিখবো, কিভাবে পাইথনে ফাইল নিয়ে কাজ করতে হয় এবং ফাইলের মধ্যে কিভাবে বিভিন্ন অপারেশন সম্পূর্ণ করা যায়। এছাড়াও আমরা এরর(errors) ও এক্সসেপশন(exceptions) এর কন্সেপ্ট গুলো বুঝবো এবং শিখবো যে কীভাবে তাদের সাথে কাজ করা যায়, কীভাবে সেগুলো হ্যান্ডেল করা যায়।
ফাইলস (Files)
রাইসা বেশ কিছুদিন হলো পাইথন প্রোগ্রামিং শেখা শুরু করেছে। সে শিখেছে যে “ডেটা হচ্ছে প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ কন্সেপ্ট”। কথাটি কিন্তু সত্য। একদিন সে একটি প্রোজেক্ট করছিল - জাস্ট পাইথন দিয়ে একটা কমান্ড-লাইন-বেসড অ্যাপ্লিকেশান। প্রোজেক্টের প্রয়োজনে তাকে বেশ কিছু ডেটা সংরক্ষণ করতে হতো, যেন সেই ডেটা গুলোকে সে পরে ম্যানিপুলেট করতে পারে। একজন বিগিনার হিসেবে সে পাইথনের বিভিন্ন ডেটা টাইপ যেমনঃ Numeric type, string, lists/array, tuples, set এবং dictionary এগুলো শিখেছিল। আর এই প্রোজেক্টে ডেটা সেভ করার জন্য সে এই ডেটা টাইপ গুলোকে ব্যবহার করে। প্রোজেক্টের সব কিছুও ভালো চলছিল, তবে ততক্ষন, যতক্ষণ না সে প্রোজেক্টটিকে পুনরায় এক্সিকিউট করলো।
রাইসা যত ডেটা নিয়ে কাজ করেছিল ও সে যে রেজাল্টগুলো রিটার্ন পেয়েছিল; সব কিছুই হারিয়ে গিয়েছে বা মুছে গিয়েছে। তবে সে চেয়ে ছিল ডেটা গুলোকে পার্মানেন্টলি স্টোর করতে। কিন্তু সে যেহেতু, ডেটা গুলো স্টোর করতে শুধুমাত্র ডেটা টাইপ ব্যবহার করেছিল, তাই সব ডেটা মুছে যায়। এই কারণে আমরা যখন কোনো প্রোগ্রামের লাইফ টাইমের (Lifetime) মধ্যে কোনো ডেটা সেভ করি, তখন প্রোগ্রাম শেষ হওয়ার সাথে সাথে আমাদের ডেটা গুলো হারিয়ে যায়। মুছে যাওয়ার কারণ হলো এই ডেটা টাইপ গুলো র্যামে (Random Access Memory) স্টোর হয়, আর র্যাম হলো একটি Volatile Memory (অর্থাৎ র্যামে স্থায়ীভাবে কোনো কিছুই সেভ হয় না।)
তো রাইসার মতো আমাদেরকেও, এমন অবস্থায় পরতে হতে পারে; যেখানে আমাদের লোকাল সিস্টেম বা কম্পিউটারেই ডেটা সংরক্ষণ করতে হবে এবং যাতে আমরা সেই ডেটা গুলো যখন খুশি তখন ফিরিয়ে আনতে পারি সে ব্যবস্থাও করতে হবে। হ্যাঁ! রাইসা পার্মানেন্টলি ডেটা সেভ করতে একটি ডেটাবেস ব্যবহার করতে পারতো, তবে এমন পরিস্থিতিও সৃষ্টি হতে পারে যখন আমরা সেটা করতে চাইবো না।
সুতরাং মাঝে মাঝে আমাদেরকে লোকাল সিস্টেমেই ডেটা সংরক্ষণ করতে হবে, যাতে যেকোনো সময় ডেটাগুলোকে অ্যাক্সেস করা যায়। এই ধরনের পরিস্থিতিতে আমরা ফাইল ব্যবহার করবো, যেটা র্যামে সেভ না হয়ে রোম(Read Only Memory)এ সেভ হবে, রোম(ROM) কিন্তু স্থায়ী মেমরি। তাই ডেটা হারিয়ে যাওয়ার ভয় থাকবে না।
এবার প্রশ্ন হলোঃ ফাইল কী?
ফাইল হলো কম্পিউটারে সংরক্ষিত তথ্যের একটি সংগ্রহ যা একটি নির্দিষ্ট নাম দিয়ে চিহ্নিত করা হয়। এটি বিভিন্ন ধরনের ডেটা থাকতে পারে যেমন:
ফাইলের প্রকারভেদ:
- টেক্সট ফাইল - লেখা বা নথি (.txt, .doc, .pdf)
- ছবির ফাইল - ফটো বা গ্রাফিক্স (.jpg, .png, .gif)
- অডিও ফাইল - সঙ্গীত বা শব্দ (.mp3, .wav)
- ভিডিও ফাইল - চলচ্চিত্র বা ভিডিও (.mp4, .avi)
- প্রোগ্রাম ফাইল - সফটওয়্যার বা অ্যাপ্লিকেশন (.exe, .apk)
ফাইলের বৈশিষ্ট্য:
- প্রতিটি ফাইলের একটি নাম এবং এক্সটেনশন থাকে
- এটি কম্পিউটারের হার্ড ড্রাইভ, USB, বা অন্য স্টোরেজ ডিভাইসে সংরক্ষিত থাকে
- ফাইল খোলা, সম্পাদনা, কপি, মুছে ফেলা বা শেয়ার করা যায়
- ফাইলের আকার বাইট, কিলোবাইট, মেগাবাইট বা গিগাবাইটে মাপা হয়
সহজ কথায়, ফাইল হলো ডিজিটাল তথ্য সংরক্ষণের একটি পদ্ধতি যা আমাদের কম্পিউটারে বিভিন্ন ধরনের ডেটা রাখতে সাহায্য করে।
ফাইল হ্যান্ডেলিং (File Handing)
পাইথন বেশ শক্তিশালী এবং তার বিভিন্ন মেথড আছে যা দিয়ে প্রায় সবকিছুই করা যায়। পাইথন দিয়ে আমরা ফাইল নিয়ে কাজ করতে পারি, ফাইলকে ম্যানিপুলেট করতে পারি। ফাইলে বিভিন্ন অপারেশন চালাতে পারি যেমনঃ
- একটা ফাইল ওপেন(open) করতে পারি,
- ফাইল পড়তে পারি, ফাইলে মধ্যে লিখতে পারি (Reading/Writing a file)
- ফাইল বন্ধ বা ক্লোজ (close) করতে পারি।
তবে যেকোনো অপারেশন করার সবার প্রথমে আমাদেরকে ফাইলটিকে খুলতে হবে।
Handling Files
যেমনটি বলছিলাম, ফাইল নিয়ে যেকোনো কাজ করার পূর্বে আমাদেরকে অবশ্য়ই ফাইলটিকে ওপেন করতে হবে।
একটি ফাইল ওপেন করতে আমরা পাইথনের open()
নামক বিল্ট-ইন ফাংশনটি ব্যবহার করবো। যেটা সাধারণত একটি ফাইল ওপেন করে, আর একটি ফাইল অবজেক্ট রিটার্ন দেয়। এই ফাইল অবজেক্টটিকে পরবর্তীতে ফাইলটিকে ম্যানিপুলেট (Manipulate) করতে ব্যবহার করা যাবে।
একটি ফাইল ওপেন করার সিনট্যাক্স হবে -
অবজেক্টের_নাম = open(ফাইলের নাম, অ্যাক্সেস মোড)
open()
ফাংশন দুইটা প্যারামিটার নেয়, প্রথমটি হলো ফাইলের নাম(যে ফাইলটিকে আমরা ওপেন করতে চায় বা যেটাকে নিয়ে কাজ করতে চায়)। দ্বিতীয় প্যারামিটারটি হলো অ্যাক্সেস মোড(Access Mode). । এই অ্যাক্সেস মোড হতে পারে - read mode, write mode, append আরো অনেক কিছু। অ্যাক্সেস মোড নিয়ে সামনে আরো বিস্তারিত বলবো।
মনে করি আমাদের কাছে programming.txt নামের একটি ফাইল আছে, চলুন ফাইলটিকে open()
ফাংশন দিয়ে ওপেন করি:
fileOBJ = open("programming.txt")
এখনে,
- ফাইল অবজেক্টটির নাম দিয়েছি fileOBJ . জাস্ট একটি ভ্যারিয়েবলের মতো।
- লক্ষ্য করুন, এখানে
open()
ফাংশনে শুধু মাত্র একটি প্যারামিটার দিয়েছি। শুধুমাত্র file name এর প্যারামিটারটি। এর কারণ হলো, Access Mode হলো ঐচ্ছিক (optional)
note: যখন Access Mode প্যারামিটারটির ভ্যালু/মান দেওয়া হয় না, তখন ফাইলটি ডিফল্ট (Default) ভাবে read mode এ ওপেন হয়।
আমরা জানি, পাইথনে open()
ফাংশন ব্যবহার করে একটি ফাইল ওপেন করা যায়। যখন ফাইলটি নিয়ে আমাদের কাজ করা শেষ হয়ে যাবে তখন আমাদের উচিৎ ফাইলটি ক্লোজ করে দেওয়া। ফাইল ক্লোজ করার জন্য আমরা close()
ফাংশন ব্যবহার করব। close()
ফাংশনকে ফাইল অবজেক্ট ব্যবহার করে কল করতে হবে। সিনট্যাক্সটি হবে এরকমঃ
fileOBJ.close()
এখানে fileOBJ হলো ফাইলের একটি অবজেক্ট। যার মধ্যে আমরা close()
কে কল করেছি।
আরো একটি বিষয় আপনাদের জেনে রাখা ভালো, পাইথনে সাধারণত দুই ধরনের ফাইল নিয়ে কাজ করা যায়, সেগুলো হলোঃ
- টেক্সট ফাইল (Text file): এর ফাইল এক্সটেনশন হলো
.txt
- বাইনারি ফাইল (Binary file): আপনার কম্পিউটারে থাকে
.bin
এক্সটেনশন যুক্ত ফাইল গুলো হলো বাইনারি ফাইল। শুধু মাত্র টেক্সট আকারে ডেটা না সেভ করে, এটি বাইনারি ফর্মে (০ এবং ১) ডেটা সেভ করে।
Working with Files
Reading
এখন আমরা শিখবো যে, কীভাবে একটি ফাইলের মধ্যে থাকে কন্টেন্টগুলো পড়া(Read) যায়। তবে আর জন্য আমাদেরকে ফাইলের অ্যাক্সেস মোডকে নির্ধারণ করে দিতে হবে। পাইথনে থাকে অ্যাক্সেস মোডগুলোঃ
r
: এটা ফাইলকে Read-only mode এ ওপেন করে।
r+
: এটা ফাইলকে read ও write উভয় টাস্কের জন্য ওপেন করে।
পাইথনে বাইনারি ফাইল নিয়েও কাজ করা যায়। বাইনারি ফাইলের জন্য থাকা অ্যাক্সেস মোড গুলো হলোঃ
rb
: এটা বাইনারি ফাইলকে Read-only mode এ ওপেন করে।
rb+
: এটা বাইনারি ফাইলকে read ও write উভয় টাস্কের জন্য ওপেন করে।
ভাবো, আমাদের কাছে “kochu.txt” নামের একটি ফাইল আছে এবং তার মধ্যে লিখা আছে - “Welcome to Kochu’s Universe. Here, tech and teach together”.
এবার চলুন এই ফাইলটিকে Read Mode এ ওপেন করিঃ
file_obj = open("kochu.txt","r")
উপরের কোড গুলো পড়ার জন্য প্রস্তুত করে ফাইলটি খুলবে, তবে ফাইলটির মধ্যে থাকা কন্টেন্টগুলো কীভাবে পড়বো? তার জন্য পাইথন আমাদেরকে read()
নামের আরেকটি মেথড(method) দিয়েছে।
file_obj = open("kochu.txt","r")
print(file_obj.read())
Output ➖
Welcome to Kochu's Universe.
Here, tech and teach together
তো আমরা দেখছি যে, read()
মেথড(method) ফাইলের শুরু থেকে শেষ পর্যন্ত পড়ে ফেলে। তবে read()
মেথডের মধ্যে একটি ঐচ্ছিক প্যারামেটার দিয়ে বলে দেওয়া যায় যে ঠিক কত বাইট(bytes) সে পড়বে। সিনট্যাক্সটা হবে এরকম- file_obj.read(bytes)
- Bytes হলো একটি Integer (পূর্ণসংখ্যা) ভ্যালু যেটা ঠিক করে দেয় যে কত Bytes পর্যন্ত পড়তে হবে।
উদাহরণঃ
file_obj = open("kochu.txt","r")
print(file_obj.read(14))
আউটপুটঃ
Welcome to Koc
এছাড়াও, readline()
নামের আরেকটি মেথড আছে, যেটা শুধু মাত্র একটি লাইন পড়েঃ-
file_obj = open("kochu.txt","r")
print(file_obj.readline())
Writing
এখন শেখার সময় হয়েছে যে কিভাবে ফাইলের মধ্যে কিছু কন্টেন্ট লিখা যায়? তো ফাইলে কিছু লিখতে চাইলে অবশ্যই ফাইলটি খোলার সময় অ্যাক্সেস মোড নির্ধারণ করে দিতে হবে। ফাইলে কোনো কিছু লেখার জন্য প্রয়োজনীয় অ্যাক্সেস মোডগুলোঃ
w
: এটা ফাইলটিকে write-only mode এ খোলে।
w+
: এটা ফাইলটিকে write ও read উভয় টাস্কের জন্যই খোলে।
বাইনারি (Binary) ফাইলের জন্যঃ
wb
: এটা বাইনারি ফাইলটিকে write-only mode এ খোলে।
wb+
: এটা বাইনারি ফাইলটিকে write ও read উভয় টাস্কের জন্যই খোলে।
কিছু জিনিস মাথায় রেখো
নিচের এই বিষয়গুলো অবশ্যই মাথায় রাখবেনঃ-
- যখন-ই আমরা একটি ফাইল writing mode এ খুলবো, তখন ফাইল পয়েন্টারটি (file pointer) ফাইলের একেবারে শুরুতে থাকবে।
- ফাইল পয়েন্টারটি (file pointer) ফাইলের একেবারে শুরুতে থাকবে, তাই ফাইলে থাকে পূর্বের কন্টেন্ট গুলো Overwrite হবে, মানে যখন ফাইলে writing mode ব্যবহার করবেন তখন শুধু ফাইলে নতুন কিছু লিখতে বা write করতে পারবেন।
- যদি writing mode এ এমন একটি ফাইল খোলার চেষ্টা করা হয়, যে ফাইলটির কোনো অস্তিত্ব নেই। তাহলে পাইথন স্বয়ংক্রিয়ভাবে একটি ফাইল তৈরি করে নিবে।
চলুন আগের সেই “kochu.txt” ফাইলটিই ব্যবহার করি, নিচে কিভাবে writing mode এ ওপেন করবেন তা দেখানো হলোঃ
file_obj = open("kochu.txt","w")
এরপর write()
মেথড ব্যবহার করে - “Kochu Programmer is the best” লিখাটি লিখে ফেলি।
file_obj = open("kochu.txt","w")
file_obj.write("Kochu Programmer is the best")
কোড রান করিয়ে, “kochu.txt” ফাইলে গিয়ে দেখুন কি পরিবর্তন ঘটেছে। হ্যাঁ, ফাইলের মধ্যে আগে যা লিখা ছিল সব মুছে গেছে আর নতুন লেখাটি যুক্ত হয়েছে।
কিন্তু আমরা চাই যে, আমাদের ফাইলে থাকা আগের কন্টেন্টগুলো থাকবে, তার সাথে নতুন কন্টেন্ট যুক্ত হবে। আমরা append mode ব্যবহার করে এটি করতে পারি। append = add at the end
পাইথনে থাকে append mode গুলো হলোঃ -
a
: এটা ফাইলকে শুধু append-only mode এ খোলে।
a+
: এটা ফাইলকে appending আর reading mode এ খোলে।
একই ভাবে বাইনারি ফাইলের ক্ষেত্রে ab
ও ab+
মোড ব্যবহার হবে।
উল্লেখ্য, আমরা যখন কোনো ফাইলকে append mode এ ওপেন করি, তখন ফাইল পয়েন্টারটি (file pointer) ফাইলের একেবারে শেষে থাকে।
এখন চলুন, আমাদের “kochu.txt” ফাইলটিতে কিছু টেস্কট যোগ করি, এক্ষেত্রে মোড হবে a
আর মেথড হবে write()
:
file_obj = open("kochu.txt","a")
file_obj.write("Together Towards Eternity.")
Exceptions
🧠 ১। Error কী? এবং এর ধরণ
প্রোগ্রামিং করার সময় বিভিন্ন ভুলের কারণে কোড ঠিকভাবে কাজ না-ও করতে পারে। এই ভুলগুলোকে একত্রে বলা হয় Error (ত্রুটি)।
মূলত দুই ধরনের Error হয়ে থাকে:
✅ ১. Syntax Error (সিনট্যাক্স ভুল)
Syntax মানে হলো প্রোগ্রামিং ভাষার নিয়মকানুন। যখন আমরা সেই নিয়ম ঠিকমতো না মানি, তখন Syntax Error হয়।
উদাহরণ:
- ভুল বানান
- ভুল ব্র্যাকেট ব্যবহার
- অনুপস্থিত colon (
:
)
ভাবো: তুমি ইংরেজিতে লেখো “I rice eat” → এটা হয়তো চলবে না কারণ english grammar মেনে লেখনি। প্রোগ্রামেও grammar না মানলে error হয়।
✅ ২. Logic Error (যুক্তিগত ভুল)
এটা সবচেয়ে মজার আর কঠিন ধরার error!
তুমি কোড ঠিকঠাক লিখছো, কোনো syntax ভুল নেই, প্রোগ্রামও চলতেছে — কিন্তু যা output আসার কথা ছিল, সেটা আসছে না।
উদাহরণ:
তুমি হিসাব করতেছো যোগফল, কিন্তু ভুল করে বিয়োগ করতেছো।
মানে: কোড রান হচ্ছে, কিন্তু ভুলভাবে! এটা হয় logic error।
⚠️ ২। Exception কী?
Exception মানে হলো — প্রোগ্রাম চালানোর সময় হঠাৎ ঘটে যাওয়া একটা বিশেষ ধরণের সমস্যা, যেটা কোডের রচনায় ভুল না, কিন্তু চালানোর সময় এমন কিছু হচ্ছে যেটা প্রোগ্রাম মোকাবিলা করতে পারছে না।
🧍 বাস্তব উদাহরণ:
তুমি একটা সংখ্যা আরেকটা সংখ্যা দিয়ে ভাগ করতেছো। কিন্তু দ্বিতীয় সংখ্যাটা যদি ০ (শূন্য) হয়?
তাহলে প্রোগ্রাম একদম থেমে যাবে, কারণ গণিতে ০ দিয়ে ভাগ করা যায় না।
এটাই হচ্ছে Exception — অর্থাৎ প্রোগ্রাম চলাকালীন (runtime) ঘটে যাওয়া এক ধরনের সমস্যা।
আরেকটা উদাহরণ:
ইউজার যদি কোনো ইনপুটে সংখ্যা না দিয়ে অক্ষর দেয়, কিন্তু প্রোগ্রাম সংখ্যা আশা করতেছে — তখনও Exception ঘটবে।
🛡️ ৩। Exception Handling কী?
Exception Handling মানে হচ্ছে — এমন একটি পদ্ধতি যার মাধ্যমে আমরা এই হঠাৎ ঘটে যাওয়া exception-গুলোর জন্য প্রস্তুত থাকি, এবং প্রোগ্রাম যেন সুন্দরভাবে সমস্যা মোকাবিলা করে চলে।
ভাবো:
তুমি দুধ চা বানাচ্ছো, আর হঠাৎ দুধ শেষ। তুমি তখন plan B নিয়ে রঙ চা বানিয়ে ফেলো।
তোমার প্রোগ্রামেও একইভাবে কোনো ভুল হলে, সেটাকে ধরা, ব্যাখ্যা দেওয়া, এবং বিকল্প উপায় বের করা — একে বলে Exception Handling।
যদি প্রোগ্রামে exception handling না থাকতো, তাহলে যেকোনো ছোট সমস্যাতেই পুরো প্রোগ্রাম বন্ধ হয়ে যেত।
🧱 ৪। Exception Class কী?
Python-এ সব Exception হলো ক্লাস (class)।
মানে, যেকোনো exception ঘটলে Python আসলে একটা class এর object তৈরি করে, এবং সেটার মাধ্যমে বলে — "ভাই, এখানে সমস্যা হইছে!"
এই ক্লাসগুলো পাইথনের ভেতরেই তৈরি করা আছে, যেগুলোকে বলে Built-in Exception Classes।
তুমি চাইলে নিজেও নতুন exception class বানাতে পারো (custom exception), কিন্তু এখন আমাদের দরকার শুধু পাইথনের তৈরি করা common exception class গুলা জানা।
🧰 ৫। কিছু Common Built-in Exception Class
নীচে কিছু গুরুত্বপূর্ণ Exception class আর তার কাজ এক নজরে দেখা যাক:
Exception Class Name | কী কারণে এই exception হয়? |
---|---|
ZeroDivisionError | কোনো সংখ্যাকে শূন্য দিয়ে ভাগ করতে গেলে |
ValueError | ভুল টাইপের মান দিলে, যেমন সংখ্যার জায়গায় অক্ষর |
TypeError | ভুল টাইপের ডাটা নিয়ে কাজ করলে, যেমন: স্ট্রিং আর নাম্বার যোগ করতে চাইলে |
IndexError | লিস্ট বা টাপল-এ যেই index নাই, সেটা এক্সেস করতে গেলে |
KeyError | ডিকশনারিতে যেই key নাই, সেটা দিয়ে খুঁজতে গেলে |
NameError | যেই ভ্যারিয়েবল ডিক্লেয়ারই করা হয়নি, সেটা ব্যবহার করতে গেলে |
FileNotFoundError | ফাইল খুলতে চাচ্ছো কিন্তু ফাইলটাই নেই |
ImportError | কোন মডিউল ইমপোর্ট করতে গিয়ে সমস্যা হলে |
AttributeError | কোন অবজেক্টে যেই attribute নাই, সেটা এক্সেস করতে চাইলে |
MemoryError | প্রোগ্রাম চালাতে গিয়ে মেমোরি শেষ হয়ে গেলে |
KeyboardInterrupt | ইউজার যদি কিবোর্ড দিয়ে প্রোগ্রাম থামিয়ে দেয় (Ctrl + C) |
🧠 মনে রাখার টিপস:
- প্রতিটা exception class একটা সমস্যার নাম — তুমি যখন exception ধরো, তখন জানো আসলে কী সমস্যা হয়েছিল।
- Python এই ক্লাসগুলো ব্যবহার করে আমাদেরকে সঠিক error message দেয়।
- Exception handling এর সময় আমরা এই ক্লাসগুলোকেই
try-except
ব্লকের ভিতরে ধরতে পারি।
🔚 শেষ কথা:
Exception class বুঝলে তুমি প্রোগ্রামের ভুলগুলো অনেক সুন্দরভাবে ধরতে পারবা। আর এগুলো জানলে error message গুলোও আর ভয় লাগবে না — বরং বুঝে ফেলার মতো সহজ হয়ে যাবে।
Exception Handling
Exception Handling হলো প্রোগ্রাম চালানোর সময় হওয়া ভুলগুলো সুন্দরভাবে ধরে ফেলার ও নিয়ন্ত্রণ করার প্রক্রিয়া।
Try-Except
try-except
স্টেটমেন্ট ব্যবহার করে আমরা এমন কোড ব্লক লিখি যেটাতে exception ঘটতে পারে।
try
ব্লকে সেই ঝুঁকিপূর্ণ কোড রাখা হয়, আর except
ব্লকে বলা হয় — যদি exception ঘটে, তাহলে কী করা হবে।
এর মাধ্যমে প্রোগ্রাম হঠাৎ বন্ধ না হয়ে, ব্যবহারকারীর জন্য সুন্দর বার্তা বা বিকল্প সমাধান দেখাতে পারে।
এটা প্রোগ্রামের স্থায়িত্ব বাড়ায় এবং ইউজার-ফ্রেন্ডলি করে তোলে।
বলা যায়, try-except প্রোগ্রামের জন্য একটা সেফটি নেট! 🛡️

এখন চলো শুরু থেকেই যে Zero-division exception নিয়ে কথা বলছিলাম, সেটা একটু দেখি
numerator = 4
denominator = 0
print(numerator / denominator)
- এই কোডে আমরা ৪ সংখ্যাটাকে ০ দিয়ে ভাগ করার চেষ্টা করছি।
- গণিতে ০ দিয়ে ভাগ করা যায় না — এটা undefined।
- তাই Python এখানে ZeroDivisionError নামে একটি exception তৈরি করবে।
- কোডটা চলবে না, সরাসরি error দেখিয়ে প্রোগ্রাম থেমে যাবে।
- যেহেতু আমরা এখানে
try-except
ব্যবহার করিনি, তাই Python নিজেই error message (ZeroDivisionError: division by zero) দেখাবে।
আগেই বলেছি, এই exception টা পাইথনের মধ্যে আগে থেকেই ম্যানেজ করা রয়েছে। তবে আমরা শিখবো কাস্টম exception এর কাস্টম solution (সমাধান) তৈরি করতে। তার জন্যি ব্যবহার করব Try-Except
⚙️ Try-Except Statement
প্রোগ্রামের কিছু কিছু অংশে এমন কোড থাকতে পারে যেগুলো চালানোর সময় exception (ভুল বা সমস্যা) ঘটতে পারে।
Python আমাদের সুযোগ দেয় এই ধরনের সন্দেহজনক কোডকে try
ব্লকের ভিতরে রাখার।
try
ব্লকের পরে থাকে except
ব্লক, যেটা তখনই চলে, যখন try
ব্লকের মধ্যে কোনো exception হয়।
এইভাবে আমরা exception-এর সময় প্রোগ্রাম থামানো না গিয়ে সেটাকে সুন্দরভাবে হ্যান্ডেল করতে পারি।
🧪 Try-Except এর সাধারণ গঠন:
try:
# এখানে সেই কোড থাকবে যেখানে exception ঘটতে পারে
except Exception1:
# যদি Exception1 ঘটে, তাহলে এই কোড চলবে
except Exception2:
# যদি Exception2 ঘটে, তাহলে এই কোড চলবে
🧠 মনে রাখার মতো কিছু পয়েন্ট:
- একটি
try
ব্লকের সাথে একাধিকexcept
ব্লক ব্যবহার করা যায়।
- কোনো
try
ব্লক থাকলে অবশ্যই অন্তত একটিexcept
ব্লক থাকা বাধ্যতামূলক।
- চাইলে আমরা সাধারণ (general)
except
ও ব্যবহার করতে পারি, যেটা সব ধরণের exception ধরতে পারে।
- এতে করে কোনো অজানা ভুল হলেও প্রোগ্রাম থেমে না গিয়ে সেই exception কে হ্যান্ডেল করে নেয়।
🎯 ছোট্ট রিমাইন্ডার:
Exception Handling শুধু error থেকে বাঁচার উপায় না, এটা প্রোগ্রামকে ইউজার-ফ্রেন্ডলি, স্মার্ট এবং রেসপনসিভ করে তোলে।
আমরা আবার division by zero উদাহরণে ফিরে গিয়ে তাতে try-except
statement ব্যবহার করি যাতে error না খায়।
try:
numerator = 4
denominator = 0
print(numerator / denominator)
except ZeroDivisionError as e:
print(e)
🔍 ব্যাখ্যা:
try
ব্লক:এখানে সেই অংশে কোড লেখা হয়েছে যেটা চলাকালীন exception ঘটতে পারে।
আমরা ৪ সংখ্যাটাকে ০ দিয়ে ভাগ করার চেষ্টা করছি — যেটা গণিতে সম্ভব না।
- Exception ঘটে:
print(numerator / denominator)
লাইনে ZeroDivisionError নামে একটা exception ঘটবে, কারণ ০ দিয়ে ভাগ করা যায় না।
except
ব্লক:যখন exception ঘটে, তখন Python সরাসরি
except
ব্লকে চলে যায়।এখানে আমরা
ZeroDivisionError
ধরেছি এবং এটিকেe
নামে ধরেছি (যেটা সেই exception এর message ধারণ করে)। এখানেZeroDivisionError
হলো Exception Class এবংe
হলো Exception Object.
print(e)
:এখানে
e
আসলে exception-এর message — Python বলবে:division by zero
এই মেসেজটা ইউজারকে বোঝাবে কী ভুল হয়েছে।
✅ কেন এটা Exception Handling?
- যদি আমরা
try-except
না ব্যবহার করতাম, তাহলে প্রোগ্রাম ক্র্যাশ করত।
- কিন্তু এখন, প্রোগ্রাম বুঝে গেছে — “ভাই, ঝামেলা হইছে” — তাই সেটা হ্যান্ডেল করে সতর্ক বার্তা দেখিয়েছে, কিন্তু বাকি প্রোগ্রাম চলা থেমে যায়নি।
📌 ছোট্ট টেকওয়ে:
এইরকম try-except
ব্যবহার করে আমরা যেকোনো ঝুঁকিপূর্ণ কাজকে নিরাপদে করাতে পারি।
ঠিক যেন, life এ fallback plan থাকলে যেমনে চাপ কমে যায় — প্রোগ্রামেও exception handling মানেই smart fallback 🔥
উপরে উদাহরণে, আমরা জানতাম যে, সেখানে এক্সেপশন ক্লাসটি হবে ZeroDivisionError
তাই আমরা সরাসরি সেটা লিখে ছিলাম, তবে যদি আমরা না জানি তাহলে আমরা base exception class - Exception
কে ব্যবহার করব।
try:
numetator = 4
denominator = 0
print(numetator / denominator)
except Exception as e:
print(e)
⚖️ ZeroDivisionError vs Exception
বিষয় | ZeroDivisionError | Exception |
---|---|---|
ধরার ধরন | নির্দিষ্ট ভুল (০ দিয়ে ভাগ) | সব ধরনের runtime ভুল |
স্পেসিফিক | ✅ হ্যাঁ | ❌ না (জেনারেল) |
Error ধরার পরিসর | কেবল Division by Zero | যেকোনো exception |
Maintainability | বেশি স্পষ্ট ও পড়তে সহজ | কম স্পষ্ট, সতর্ক থাকতে হয় |
ব্যবহারের সময় | যখন নিশ্চিত জানি কী ভুল হবে | যখন ভুল নিশ্চিত না বা fallback দরকার |
উদাহরণ | except ZeroDivisionError: | except Exception: |
📌 টেকওয়ে:
ZeroDivisionError
ইউজ করো যখন তুমি স্পষ্টভাবে জানো ঠিক কী ধরনের ভুল হতে পারে।
Exception
ইউজ করো খুব সাবধানে, সাধারণত সবশেষ fallback হিসেবে।
🧠 Try-Except-Else স্টেটমেন্ট: ব্যতিক্রম ছাড়াও কিছু হতে পারে!
আমরা আগেই শিখেছি কীভাবে try-except
ব্লক দিয়ে আমাদের প্রোগ্রামে ভুল (error) হ্যান্ডেল করা যায়। আজকে আমরা শিখবো try-except-else
স্টেটমেন্ট, যেটা আমাদের আরেকটু কনট্রোল দেয়।
📌 সিনট্যাক্স:
try:
# এখানে এমন কোড থাকবে যেটা error করতে পারে
except SomeException:
# error ধরলে এখানে চলে আসবে
else:
# যদি কোনো error না হয়, তাহলে এই ব্লকটা রান হবে
🤔 তাহলে else
ব্লক কবে চলে?
else
ব্লক তখনই চলে, যখন try
ব্লকের কোড একটা error ছাড়াই সফলভাবে শেষ হয়।
আর যদি try
ব্লকে exception ওঠে, তাহলে except
ব্লক রান হবে, else
ব্লক আর রান হবে না।
✅ একটা এক্সাম্পল দেখি:
try:
number = int(input("দয়া করে একটা সংখ্যা দাও: "))
except ValueError:
print("ভাই, তুমি একটা সংখ্যার বদলে অন্য কিছু দিলে কেন!")
else:
print("তুমি যেটা লিখছো, সেটা সংখ্যা। ধন্যবাদ!")
🔍 ব্যাখ্যা:
- যদি ইউজার সংখ্যা দেয়, তাহলে
try
ব্লকে কোনো error হবে না, তাইelse
ব্লক রান করবে।
- কিন্তু যদি ইউজার সংখ্যা ছাড়া কিছু দেয় (যেমন: 'abc'), তাহলে
ValueError
উঠবে,except
ব্লক চালু হবে, আরelse
স্কিপ হবে।
🔥 কেন else
দরকার?
অনেক সময় আমরা চাই, যদি সব কিছু ঠিকঠাক চলে তাহলে একটা নির্দিষ্ট কাজ করবো। কিন্তু যদি exception উঠে, তখন ওই কাজটা না করি।
এটা কোডকে ক্লিন ও readable করে তোলে।
🔚 শেষ কথা:
try-except-else
ব্যবহার করলে তোমার প্রোগ্রাম আরও নিয়ন্ত্রিত, সুপরিকল্পিত হয়। ডেভেলপার হিসেবে আমাদের লক্ষ্য হওয়া উচিত কোডে সম্ভাব্য সব পরিস্থিতি হ্যান্ডেল করা। So, else
ব্লকটা ভুলে যেও না! ✨
🔥 Try-Except-Finally স্টেটমেন্ট: শেষ পর্যন্ত আমি চালাবোই!
আমরা জানি, কোনো exception উঠলে except
ব্লক চলে, আর না উঠলে else
ব্লক চলে।
কিন্তু কিছু কিছু কোড থাকে যেটা সবসময় চালাতে হয়, সেটা error থাকুক আর নাই থাকুক।
সেই কাজটা করার জন্যই আছে ➤ finally
ব্লক।
📌 সিনট্যাক্স:
try:
# রিস্কি কোড
except SomeException:
# error ধরার কাজ
finally:
# যাই হোক, আমি তো চলবই
✅ উদাহরণ:
try:
num = int(input("একটা সংখ্যা দাও: "))
result = 10 / num
except ValueError:
print("সংখ্যা ছাড়া কিছু দিলে চলবে না ভাই!")
except ZeroDivisionError:
print("০ দিয়ে ভাগ করা যায় না!")
finally:
print("ধন্যবাদ, প্রোগ্রাম শেষ হয়েছে।")
🔍 ব্যাখ্যা:
- ইউজার যদি সংখ্যা না দেয় →
ValueError
উঠবে → সেই ব্লক রান হবে।
- ইউজার যদি ০ দেয় →
ZeroDivisionError
উঠবে → সেই ব্লক রান হবে।
- ইউজার যদি ঠিকঠাক সংখ্যা দেয় →
try
ব্লক সফলভাবে চলবে।
- কিন্তু সব ক্ষেত্রেই
finally
ব্লকের লাইনটা শেষ পর্যন্ত চালবেই।
🤔 finally
কেন দরকার?
ধরো তুমি কোনো ফাইল ওপেন করেছো বা ডাটাবেস কানেকশন করেছো।
প্রোগ্রামে error থাকলে তুমি সেই ফাইল বা কানেকশন বন্ধ করতে ভুলে যেতে পারো।
তখন finally
ব্লক দিয়ে তুমি নিশ্চিত করতে পারো, ফাইল বন্ধ হোক, রিসোর্স ক্লিন হোক — যাই হোক, execute হবেই।
✅ উদাহরণ (ফাইল হ্যান্ডলিং):
try:
file = open("data.txt", "r")
content = file.read()
print(content)
except FileNotFoundError:
print("ফাইলটা খুঁজে পেলাম না!")
finally:
file.close()
print("ফাইল বন্ধ করে দিলাম।")
🧠 Summary:
Block | কখন চলে? |
---|---|
try | সবসময় চেষ্টা করবে কোড চালাতে |
except | try ব্লকে error উঠলে চলে |
else | try সফলভাবে চললে, আর error না উঠলে |
finally | error উঠুক বা না উঠুক — চলবেই! |
চলো এবার তোমরা একটা ফাইল ওপেন করে try-except-finally
দিয়ে এমন একটা কোড লেখো, যেটা ফাইল রিড করে, exception হ্যান্ডেল করে, এবং সবশেষে ফাইল বন্ধ করে।
আমি পাশে আছি! 🤝✨
কোড করো, ভুল করো, শিখো — কারণ আমরা কোচু প্রোগ্রামার! 🚀💚
🧨 raise দিয়ে নিজের মতো error তোলা (Custom Exception)
আমরা আগেই শিখেছি — Python নিজে থেকে অনেক error তোলে। যেমনঃ
- সংখ্যা ছাড়া কিছু দিলে ➤
ValueError
- ০ দিয়ে ভাগ করলে ➤
ZeroDivisionError
কিন্তু ধরো তুমি চাইছো — কেউ যদি তোমার প্রোগ্রামে ভুল input দেয়, তখন তুমি নিজেই error তুলবে।
এই কাজটা করার জন্য Python-এ আছে ➤ raise
✅ সাধারণ raise
ব্যবহার
age = -5
if age < 0:
raise ValueError("বয়স কখনো ঋণাত্মক হতে পারে না!")
🧠 এখানে কী হলো?
- যদি বয়স ০-এর কম হয়, তাহলে আমরা নিজেরা
ValueError
তুলছি।
- Python এর মতো করেই আমরাও বলতে পারি ➤ "ভুল হইছে, চল প্রোগ্রাম থামাই" 😅
💥 কাস্টম Exception তৈরি
আমরা চাইলে নিজের মতো error class বানাতে পারি।
উদাহরণ:
# Step 1: নতুন একটা এক্সেপশন বানাই
class UnderAgeError(Exception):
pass
# Step 2: ফাংশনে বয়স চেক করি
def check_age(age):
if age < 18:
raise UnderAgeError("তোমার বয়স ১৮-এর কম, তুমি এই সাইটে ঢুকতে পারো না!")
# Step 3: এখন try-except দিয়ে call করি
try:
check_age(15)
except UnderAgeError as e:
print("ভুল:", e)
🧠 এখানে কী হচ্ছে?
- আমরা
UnderAgeError
নামে নিজস্ব error বানালাম।
- যখন কেউ ১৮ বছরের কম হয়, তখন ওই error তুলি।
- তারপর
except
ব্লকে সেটা ধরে ফেলি।
🔄 কেন raise
দরকার?
কখন দরকার | উদাহরণ |
---|---|
ইউজার input ঠিক না | বয়স ০ বা নেগেটিভ |
তুমি চাইছো কেউ কোনো নিয়ম না ভাঙে | ১৮’র নিচে access না পায় |
কোডে সমস্যা ধরতে | ডাটা ফাঁকা থাকলে raise করো |
🧪 তোমার কাজ (Practice):
তুমি একটা ফাংশন লিখো ➤ square_root(x)
যেখানে যদি কেউ x
এর ভ্যালু নেগেটিভ দেয়, তখন তুমি raise NegativeNumberError
করে দেবে।
চলো দেখি কে কে পারে! ✌️
👉 মনে রাখো ভাই, কোডিং মানে শুধু কাজ না — ভালোভাবে ভুল হ্যান্ডেল করাটাও একটা স্কিল!
আর আমরা, কোচু প্রোগ্রামাররা, সবসময় পেশাদার মতো কোড করি 💻💚
✅ assert
: চেক করো, ভুল হলে সঙ্গে সঙ্গে ধরো!
assert
হচ্ছে Python-এর একটা ডিবাগিং টুল। এটা দিয়ে তুমি বলো,
“এই শর্তটা যদি ভুল হয়, তাহলে সরাসরি আমাকে জানাও — আমি এই কোড চালাতে চাই না।”
একদম সহজ ভাষায়, এটা হলো "ভাই, এইটা সত্য না হলে আমি থেমে যাবো!" 😤
🔍 assert
এর ব্যবহার
x = 10
assert x > 0
print("x পজিটিভ, সব ঠিক আছে!")
🧠 ব্যাখ্যা:
assert
চেক করেx > 0
সত্য কিনা।
- যদি সত্য হয় ➤ প্রোগ্রাম চলবে।
- যদি মিথ্যা হয় ➤ Error (AssertionError) উঠবে এবং প্রোগ্রাম থেমে যাবে।
❌ যদি শর্ত ভুল হয়?
x = -5
assert x > 0, "x নেগেটিভ, এটা ঠিক না!"
এখানে x > 0
মিথ্যা, তাই নিচের মতো error আসবে:
AssertionError: x নেগেটিভ, এটা ঠিক না!
🎯 assert
কবে ব্যবহার করবো?
কখন | উদাহরণ |
---|---|
প্রোগ্রামে কিছু ধরেই নিচ্ছো যে সত্য হবে | যেমনঃ ইউজার নাম্বারই দিবে |
কোডে ভুল আসলে সঙ্গে সঙ্গে ধরতে চাও | যেনো বড় ভুল হওয়ার আগেই থেমে যায় |
ডেভেলপমেন্ট টাইমে টেস্ট করার জন্য | প্রোডাকশন-এ না, শেখার সময় বা নিজের চেকিং-এর জন্য |
✅ আরেকটা রিয়েল লাইফ উদাহরণ:
def withdraw(balance, amount):
assert amount <= balance, "তোমার ব্যালেন্সে এত টাকা নাই!"
return balance - amount
print(withdraw(1000, 1200))
এই কোডে যদি কেউ ১০০০ টাকা রেখে ১২০০ টাকা তুলতে চায়, সঙ্গে সঙ্গে AssertionError উঠে যাবে।
🔒 সতর্কতা:
⚠️ প্রোডাকশন কোডে assert সবসময় ON থাকে না।তাই important validation এর জন্য
raise
বা proper if-else ব্যবহার করো।
assert
শুধু internal check/test/debugging এর জন্যই ভালো।
✅ তোমার টাস্ক:
একটা ফাংশন লিখো ➤ calculate_average(numbers)
- assert দিয়ে চেক করো, লিস্টটা খালি না।
- তারপর গড় বের করো।
🎯 শেষ কথা:
assert
হচ্ছে তোমার কোডের সেই বন্ধু, যে চুপচাপ বসে থাকে — কিন্তু যখনই কোনো ভুল দেখে, বলে ➤
"ভাই, এইটা ঠিক না, একদমই না!" 😤
আর আমরা — কোচু প্রোগ্রামাররা — শুধু কোডই লিখি না, আমরা ভুল ধরতেও মাস্টার! 🌱💻