মূল content-এ যাও

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 দিয়ে:

main.py

দ্বিতীয় call-এ program থেমে গেছে একটা স্পষ্ট message সহ। Program থামানো এখানে ভালো জিনিস।

কেন দরকার?

ধরো তুমি একটা training function লিখেছো, আর কেউ ভুল করে learning_rate=5 দিল। দুটো সম্ভাবনা:

  1. চুপচাপ চালিয়ে যাওয়া — ৩ ঘণ্টা GPU-তে training চলল, loss হয়ে গেল nan, model বেকার। কেন? কেউ জানে না।
  2. শুরুতেই raise — এক সেকেন্ডে স্পষ্ট message: "learning rate 0 থেকে 1-এর মধ্যে হতে হবে, পেয়েছি 5"।

দ্বিতীয়টাকে বলে fail fast। ভালো library-গুলো এভাবেই লেখা — scikit-learn-এ ভুল parameter দিলে সাথে সাথে স্পষ্ট ValueError পাবে।

ভালো error message

main.py

ভালো message-এ থাকে:

  • কী ভুল — "column নেই"
  • কী পেয়েছি — 'salary'
  • কী আশা করেছিলাম — ['age', 'city']

এমন message দেখলে user নিজেই ঠিক করে ফেলতে পারে।

কোন exception raise করবে?

Built-in exception-ই সাধারণত যথেষ্ট:

পরিস্থিতিException
মান অগ্রহণযোগ্য (negative বয়স, ভুল ratio)ValueError
ভুল type (string-এর জায়গায় list)TypeError
Key/নাম খুঁজে পাওয়া যায়নিKeyError
এখনো বানানো হয়নি এমন featureNotImplementedError
main.py

নিজের exception class

নিজের domain-এর জন্য আলাদা error বানানো যায় — শুধু Exception থেকে inherit করো:

main.py

scikit-learn-এ ঠিক এরকম একটা আছে: NotFittedError। নিজের class থাকলে caller শুধু তোমার error আলাদাভাবে ধরতে পারে।

Re-raise: ধরো, কিছু করো, আবার ছুঁড়ে দাও

main.py

Log করেছি, কিন্তু error চাপা দিইনি — শুধু raise লিখে সেটা উপরে পাঠিয়ে দিয়েছি।

Exercise

Exercise

Learning rate যাচাই

+20 XP

check_learning_rate(lr) function লেখো:

  • lr যদি 0-এর চেয়ে বড় আর 1-এর চেয়ে ছোট হয় → lr return করবে
  • নাহলে ValueError raise করবে, message-এ ভুল মানটা থাকবে — যেমন "learning rate 0 থেকে 1-এর মধ্যে হতে হবে, পেয়েছি 5"
solution.py

Quiz

  1. Q1Function-এ ভুল input পেলে raise করা কেন None return করার চেয়ে ভালো?
  2. Q2class DataError(Exception): pass — except Exception কি DataError ধরবে?
  3. Q3except ValueError: raise — শুধু raise লিখলে কী হয়?
0/3 answered

Challenge

Challenge

নিজের exception class

+50 XP

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-এ

solution.py

বাস্তবে কোথায় ব্যবহার হয়?

Training শুরুর আগে config যাচাই — সব সমস্যা একবারে খুঁজে একসাথে জানানো, যাতে user বারবার চালিয়ে একটা একটা ভুল খুঁজতে না হয়:

main.py

ConfigError নিজে ValueError থেকে inherit করেছে — তাই কেউ except ValueError লিখলেও ধরা পড়বে।

Interview প্রশ্ন

  • Beginner: raise কী করে? কখন ValueError আর কখন TypeError raise করবে?
  • Intermediate: নিজের exception class কেন বানাবে? কোন class থেকে inherit করবে?
  • Advanced: raise NewError(...) from e কী করে? Exception chaining কেন debugging-এ কাজে লাগে?

এরপর কী?

Program-এর data এখন পর্যন্ত শুধু memory-তে ছিল — program শেষ, data শেষ। পরের lesson: File Handling — data disk-এ রাখা আর পড়া।