Python for AI/Errors ও Files/Lesson 28
Exception raise করা
নিজের function-এ ভুল input ধরে raise দিয়ে স্পষ্ট error দাও — ভালো error message, নিজের exception class, re-raise আর "fail fast" নীতি।
- সময়
- 20 মিনিট
- Exercise
- 1
- Challenge
- 1
- Quiz
- 3 প্রশ্ন
সহজ ভাষায়
আগের lesson-এ Python-এর ছোড়া error ধরেছি। এবার নিজে ছুঁড়বো — raise দিয়ে:
দ্বিতীয় call-এ program থেমে গেছে একটা স্পষ্ট message সহ। Program থামানো এখানে ভালো জিনিস।
কেন দরকার?
ধরো তুমি একটা training function লিখেছো, আর কেউ ভুল করে learning_rate=5 দিল। দুটো সম্ভাবনা:
- চুপচাপ চালিয়ে যাওয়া — ৩ ঘণ্টা GPU-তে training চলল, loss হয়ে গেল
nan, model বেকার। কেন? কেউ জানে না। - শুরুতেই raise — এক সেকেন্ডে স্পষ্ট message: "learning rate 0 থেকে 1-এর মধ্যে হতে হবে, পেয়েছি 5"।
দ্বিতীয়টাকে বলে fail fast। ভালো library-গুলো এভাবেই লেখা — scikit-learn-এ ভুল parameter দিলে সাথে সাথে স্পষ্ট ValueError পাবে।
ভালো error message
ভালো message-এ থাকে:
- কী ভুল — "column নেই"
- কী পেয়েছি —
'salary' - কী আশা করেছিলাম —
['age', 'city']
এমন message দেখলে user নিজেই ঠিক করে ফেলতে পারে।
কোন exception raise করবে?
Built-in exception-ই সাধারণত যথেষ্ট:
| পরিস্থিতি | Exception |
|---|---|
| মান অগ্রহণযোগ্য (negative বয়স, ভুল ratio) | ValueError |
| ভুল type (string-এর জায়গায় list) | TypeError |
| Key/নাম খুঁজে পাওয়া যায়নি | KeyError |
| এখনো বানানো হয়নি এমন feature | NotImplementedError |
নিজের exception class
নিজের domain-এর জন্য আলাদা error বানানো যায় — শুধু Exception থেকে inherit করো:
scikit-learn-এ ঠিক এরকম একটা আছে: NotFittedError। নিজের class থাকলে caller শুধু তোমার error আলাদাভাবে ধরতে পারে।
Re-raise: ধরো, কিছু করো, আবার ছুঁড়ে দাও
Log করেছি, কিন্তু error চাপা দিইনি — শুধু raise লিখে সেটা উপরে পাঠিয়ে দিয়েছি।
Exercise
Exercise
Learning rate যাচাই
check_learning_rate(lr) function লেখো:
lrযদি 0-এর চেয়ে বড় আর 1-এর চেয়ে ছোট হয় →lrreturn করবে- নাহলে
ValueErrorraise করবে, message-এ ভুল মানটা থাকবে — যেমন"learning rate 0 থেকে 1-এর মধ্যে হতে হবে, পেয়েছি 5"
Quiz
Challenge
Challenge
নিজের exception class
ML-এ train/test ভাগ করার একটা function লেখো, ঠিকমতো error সহ:
1. InsufficientDataError নামে নিজের exception class বানাও (Exception থেকে inherit)
2. split(data, test_ratio) function:
- test_ratio 0 আর 1-এর মধ্যে না হলে (দুই প্রান্ত বাদে) → ValueError
- data-তে ৫টার কম item থাকলে → InsufficientDataError
- নাহলে (train, test) return করবে: শেষের int(len(data) * test_ratio)টা item test-এ, বাকি train-এ
বাস্তবে কোথায় ব্যবহার হয়?
Training শুরুর আগে config যাচাই — সব সমস্যা একবারে খুঁজে একসাথে জানানো, যাতে user বারবার চালিয়ে একটা একটা ভুল খুঁজতে না হয়:
ConfigError নিজে ValueError থেকে inherit করেছে — তাই কেউ except ValueError লিখলেও ধরা পড়বে।
Interview প্রশ্ন
- Beginner:
raiseকী করে? কখনValueErrorআর কখনTypeErrorraise করবে? - Intermediate: নিজের exception class কেন বানাবে? কোন class থেকে inherit করবে?
- Advanced:
raise NewError(...) from eকী করে? Exception chaining কেন debugging-এ কাজে লাগে?
এরপর কী?
Program-এর data এখন পর্যন্ত শুধু memory-তে ছিল — program শেষ, data শেষ। পরের lesson: File Handling — data disk-এ রাখা আর পড়া।